【问题标题】:Instantiating object of generic subclass that inherits from non-generic base class实例化从非泛型基类继承的泛型子类的对象
【发布时间】:2016-01-17 11:49:22
【问题描述】:

我有一个像这样的基类:

public class Base{
    private string name = string.Empty();

    public Base(string name){
        this.name = name;
    }

    public string Name{get;set;}
}

我有一个泛型类,它继承自 Base 类,还包含一个返回泛型类型 T 的对象的方法,如下所示:

public SubClass<T>:Base{
    public SubClass(string name):base(name){}

    public T method(string parameter){
        //do some stuff here and return T
        return T;
    }
}

我实例化了SubClass的一个对象:

object instance = new SubClass<object>("name");

并且我不在构造函数中使用泛型类型。 SubClass 构造函数中的参数是预定义的类型(例如字符串、整数等)。这个实现工作正常但我想知道这是否正确?有没有另一种更合适的方法来做到这一点。谢谢

编辑

上下文: Base 类是一个处理与 CouchDB 的连接的类。所以我提供了必要的信息(用户名、密码、主机、端口和数据库名称),SubClass 是 CouchDB 的一个简单客户端。因此,当我创建 SubClass 的对象时,我想提供 CouchDB 的凭据,并且还想提供我期望从数据库中获得的模型(例如 Account 模型、Product 模型)。

【问题讨论】:

  • 您已经正确定义了子类及其构造函数。并且您在实例化时将“对象”指定为泛型类型。但是为什么要将实例存储为对象?如果然后指定对象,那么创建泛型类型有什么意义?你到底想达到什么目的?

标签: c# oop generics inheritance


【解决方案1】:

看到你的代码我有点困惑。为什么将SubClass 的实例存储在对象中?这样一来,您将无法调用类的任何成员(继承自 System.Object 的成员除外)。

我还想提供模型(例如帐户模型、产品模型) 我对数据库的期望

我假设这些不同类型的模型实现了一个通用接口,所以结构看起来像这样:

public interface IModel
{
    Foo GetFoo();
}

public class AccountModel : IModel
{
    public Foo GetFoo()
    {
        // whatever
    }
}

public class ProductModel : IModel
{
    public Foo GetFoo()
    {
        // whatever
    }
}

由于我们知道SubClass 的类型参数是IModel,因此最好对T 设置类型约束:

public class SubClass<T> : Base where T : IModel
{
    public SubClass(string name) : base(name){}

    public T Method(string parameter)
    {
        //do some stuff here and return T
        return T;
    }
}

我会这样使用它:

SubClass<ProductModel> pm = new SubClass<ProductModel>("blurg");
IModel model = pm.Method();
Foo foo = model.GetFoo();

【讨论】:

  • 感谢您的时间,这里有一些答案:“为什么要将 SubClass 的实例存储在对象中”:这是一个示例。有人会调用库方法,它会返回他将传入的类的实例,例如 Account account = new SubClass("blurg");"我假设这些不同类型的模型实现了一个公共接口":你不能假设,这将超出图书馆的控制范围。
  • 即使您不能假设按照建议进行设计更改,您至少应该确保库方法返回类型为 classtype >。如果这是真的,那么您不必担心,您当前的代码是好的,并且将按照此处所示的方式工作,只是类型参数不会被限制为模型合同 IModel,如本答案所示。
猜你喜欢
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多