这可能是一个愚蠢的问题,但在这里它.想象你有以下类:
public class C
{
}
public class D : C
{
//A subclass of C
}
public class A
{
C argument;
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望有一个继承自A的类B.这个类显然会继承"参数"字段,但我希望强制B中的"参数"字段为D类,而不是C.Since D继承自C,这不应该造成任何问题.那么,如何在c#中实现这一目标?
Eri*_*ert 10
正如贾里德指出的那样,这是不可能的.但是,考虑为什么不这样做很有意思.
假设该字段是私有的.然后它无法在派生类B中访问.(假设B不是嵌套类型的A.)
假设该字段不是私有的.无论是公共内部,内部保护还是内部保护都无关紧要.假设它的公众和这是合法的.现在你有以下情况.
class B : A
{
override public D argument; // "overrides" A.argument
}
class E : C { }
class F
{
public static void M(A a)
{ a.argument = new E(); }
}
...
F.M(new B());
Run Code Online (Sandbox Code Playgroud)
嘿,你只是撞坏了运行时.您刚刚将一个类型为E的对象写入一个只能存储类型D的字段中.(我们可以为其他配置(如受保护的字段等)制作类似的崩溃方案.)
现在,你可能会说,好吧,让我做一个只读属性.我可以虚拟化:
class A
{
public virtual C Argument { get; }
}
class B : A
{
public override D Argument { ... }
}
Run Code Online (Sandbox Code Playgroud)
现在问题消失了.公共接口是不可写的,所以在那里写一些不受支持的东西没有问题.该属性是虚拟的,因此有一种覆盖它的机制.
该功能称为"返回类型协方差",在C#中也不支持.在实现接口方法时,请参阅为什么"协方差"和"反演"的概念适用?.
请解释一下你真正要做的事情,而不是你要怎么做.可能有更好的方法.