C#继承字段

Emi*_*l D 4 c# inheritance

这可能是一个愚蠢的问题,但在这里它.想象你有以下类:

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#中也不支持.在实现接口方法时,请参阅为什么"协方差"和"反演"的概念适用?.

请解释一下你真正要做的事情,而不是你要怎么做.可能有更好的方法.