C# 如何为继承层次结构创建视图

C# 如何为继承层次结构创建视图,c#,inheritance,C#,Inheritance,我想不出为继承层次结构创建视图的方法。如果我像下面的代码中那样创建类层次结构,那么我就无法在不强制转换的情况下从BView.Set(…)正确使用B类的方法和属性,因为BView是从AView继承的。Set方法签名接受A类型的变量,但在BView中,我希望设置B类型的变量。我如何解决我的问题 公共A类 { 公共int id; 收到的公共信息; } B级:A级 { 公共日期时间日期; //…其他字段和属性 公共方法(); //…其他方法 } 公共接口IView { T源{get;} void Ini

我想不出为继承层次结构创建视图的方法。如果我像下面的代码中那样创建类层次结构,那么我就无法在不强制转换的情况下从BView.Set(…)正确使用B类的方法和属性,因为BView是从AView继承的。Set方法签名接受A类型的变量,但在BView中,我希望设置B类型的变量。我如何解决我的问题

公共A类
{
公共int id;
收到的公共信息;
}
B级:A级
{
公共日期时间日期;
//…其他字段和属性
公共方法();
//…其他方法
}
公共接口IView
{
T源{get;}
void Init(T源);
无效显示(bool-isOn);
bool IsActive();
}
公共类AView:IView
{
公共源{get;private set;}
公共无效集(源){
来源=来源;
}
}
公共类视图:AView
{
///???
}

谢谢3

BView
不应是
AView
的子类型(就像a)

为什么??声明子类型可以用作超类型的“插入替换”。但是,对于
BView
AView
,这并不令人满意:

AView v = new AView();
v.Set(new A()); // that's fine
现在,如果我们替换BView,会发生什么

AView v = new BView();
v.Set(new A()); // that should not be possible
换句话说:BView不满足与AView的is-a关系,因此,BView不应是AView的子类


现在,我们如何解决这个问题

您可以创建界面,以确保
IView
自动成为
IView
。为此,您需要确保其类型参数
T
仅出现在“out”位置:

public interface IView<out T>
{
   T Source{get;}
   // void Init(T source); -- we can't do that anymore
   void Display(bool isOn);
   bool IsActive();
}
公共接口IView
{
T源{get;}
//void Init(T source);--我们不能再这样做了
无效显示(bool-isOn);
bool IsActive();
}

缺点:您将无法再使用Init方法,这方便地避免了上述问题。但是,您可以在
AView
/
BView
构造函数中设置源代码。

为什么
BView
不是
BView:IView
?不幸的是,我不能使用构造函数,因为这些视图类是从MonoBehavior类(UnityEngine中的基类之一)继承的。UnityEngine不允许开发人员通过构造函数创建这种类型的类。但让我感谢你们的广泛回答。这真的很有帮助。:)现在,我想,我可以找到解决问题的方法了。也许,我会尝试用协变函数划分接口,用setter划分另一个接口。