【问题标题】:Looking for an interface/abstract but with methods returning different types寻找接口/抽象,但方法返回不同类型
【发布时间】:2013-12-11 17:05:48
【问题描述】:

我正在为基类寻找一种设计模式,它强制所有派生类实现所有基类方法,而派生类中的方法具有不同的返回类型。该场景是一个通用的 MemoryObject 类(接口/抽象),在内存中/从内存中保存和返回 whatever 类型的对象。但是派生类(静态/密封/单例)应该返回正确的类型。

所以要求是 - 强制所有派生类实现基类的所有属性和方法 - 派生类中的方法必须返回正确的类型

这是一些示例代码,不可编译,但用于说明:

    public interface MemoryObject
    {
         object FromMemory { get; }
         //... other properties and methods
    }

    public sealed class MemoryObjectA : MemoryObject
    {
        public static List<string> FromMemory 
        {
            get { return new List<string>(); }
        }

        //... other properties and methods
    }

    public sealed class MemoryObjectB : MemoryObject
    {
        public static DataTable FromMemory 
        {
            get { return new DataTable(); }
        }

        //... other properties and methods
    }

提前感谢您的建议!

【问题讨论】:

  • 几个小尼特。您使用的不是基类,而是接口,标准命名约定还规定 iterfaces 应以 I 开头,因此您的接口应为 public interface IMemoryObject

标签: c# design-patterns


【解决方案1】:

听起来你只需要让它通用:

public interface MemoryObject<T>
{
     T FromMemory { get; }
     //... other properties and methods
}

public class MemoryObjectA : MemoryObject<List<string>> { ... }
public class MemoryObjectB : MemoryObject<DataTable> { ... }

请注意,实现方法必须是实例方法,不是静态方法。 (如果您愿意,您可以将实现设为单例。)

【讨论】:

  • +1。请注意,如果继承很重要(MemoryObject&lt;OneClass&gt;MemoryObject&lt;OtherClass&gt; 没有继承关系),则可能需要类似于 IEnumerable&lt;T&gt; / IEnumerable 的非泛型版本的基类/接口。
  • @AlexeiLevenkov:我建议提供一个协变接口。
  • 感谢您迄今为止的建议!泛型方法指向了正确的方向,但这意味着需要使用派生类来实现很多逻辑(单例)。因为很多开发人员应该能够使用这个概念并将其应用于新的派生对象,所以这个概念应该简单、容易,比如说 idiot-proof...
  • @Loonis:实现单例非常简单——参见csharpindepth.com/Articles/General/Singleton.aspx——但是不能很好地处理继承——你不能继承“单例”一个不错的方式。就我个人而言,我首先会担心鼓励大量单身人士。
猜你喜欢
  • 2021-04-09
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2020-02-04
  • 1970-01-01
  • 2011-10-07
  • 2014-11-24
相关资源
最近更新 更多