繁体   English   中英

具有类继承和泛型类型继承的 C# 集合不允许添加继承的类

[英]C# Collection with class inheritance and generic type inheritance does not allow to add inherited class

我遇到了一些可能的事情,但不起作用。

这是示例类,

abstract class BaseModel { }

abstract class BaseViewModel<T> where T : BaseModel
{
    protected T model;
}

class ModelA : BaseModel { }

class ViewModelA : BaseViewModel<ModelA> { }

现在我试着做

class Program
{
    static void Main(string[] args)
    {
        var collection = new List<BaseViewModel<BaseModel>>();
        collection.Add(new ViewModelA());
    }
}

直觉上,它看起来是工作。 但是,无法添加ViewModelA

我想知道为什么这是不可能的,并解决这种情况。

ViewModelA不等于BaseViewModel<BaseModel>即使您可能认为它是

这是因为类是不变的。

  • 不变性:意味着您只能使用最初指定的类型

  • 协方差:使您能够使用比最初指定的更派生的类型

实现您想要的(可能)的一种方法是通过out generic modifier使用协变接口参数 但是,它有一定的局限性。 类型参数只能用作接口方法返回类型,不能用作方法参数的类型

例子

public interface IBaseViewModel<out T>  where T : BaseModel 
{ 
   ... 
}

abstract class BaseViewModel<T> : IBaseViewModel<T> where T : BaseModel 
{
   protected T model; 
}

class ModelA : BaseModel { }

class ViewModelA : BaseViewModel<ModelA> { }

static void Main(string[] args)
{
   var collection = new List<IBaseViewModel<BaseModel>>();
   collection.Add(new ViewModelA()); // this now works
}

关于您的实现,我用简单的话来说有不同的理论,根据您的实现,您的BaseViewModel<T>BaseModel都是抽象的,这意味着您不能实例化抽象类,这意味着您不能使用BaseViewModel<BaseModel> baseModel = new ViewModelA(); . 当您添加到集合时,您试图为违反抽象类规则的抽象类创建一个实例。 我已经修改了你的一点点,以便你可以添加到集合中。


abstract class BaseModel { }

abstract class BaseViewModel<T> where T : BaseModel
{
     protected T model;
}

class ModelA : BaseModel { }

class ViewModelA : BaseViewModel<ModelA> { }

static async Task Main(string[] args)
{
    var collection = new List<BaseViewModel<ModelA>>();
    collection.Add(new ViewModelA());
}

您也可以按照前面的答案制作接口来制作解耦类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM