[英]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.