gpt4 book ai didi

c# - 具有内部类对象的抽象类构造函数继承

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:08 25 4
gpt4 key购买 nike

假设我有一个抽象类 A。我有一些内部类,如下所示:

public abstract class A
{
public InnerOne x;
public InnerTwo y;
public A(){
this.x = new InnerOne();
this.y = new InnerTwo();
}
public class InnerOne
{
public virtual double value(){
return 0;
}
}
public class InnerTwo
{
public virtual double value(){
return 0;
}
}
}

然后我得到了像这样的 child :

 public class B: A
{
public B():base(){

}
public class InnerOne: A.InnerOne
{
public override virtual double value(){
return 100;
}
}
public class InnerTwo: A.InnerTwo
{
public override virtual double value(){
return 100;
}
}
}

所以我认为,当我像这样调用 B 构造函数时,我将通过创建它的内部类实例来初始化 xy。但实际上它不是那样工作的。当我调用 vaule 函数时,它会返回零。

A newobject = new B();
var bv1 = B.x.value();
var bv2 = B.y.value();

有没有办法强制 B 类通过它的内部类对象(而不是来自父抽象的对象)来初始化它的 xy 字段类)而不重写它的构造函数?

最佳答案

即使你在A或B内部定义了类,它们仍然是公共(public)的,并且在A或B外部可以访问它们。这与在A或B外部定义的类没有区别。

想象一下在类 A 和 B 之外定义了 InnerOneInnerTwo 的相同代码。它将具有与上述相同的行为。您的困惑根源是误解了内部类的用法。

为了获得 100,在 B 中,您需要用覆盖这些值的实例显式替换 X 和 Y 变量的实例。除非你这样做,否则你不会得到 100。

 public class B: A
{
public B():base(){
X = new OverridenInnerOne();
Y = new OverridenInnerTwo();
}
public class OverridenInnerOne: A.InnerOne
{
public override virtual double value(){
return 100;
}
}
public class OverridenInnerTwo: A.InnerTwo
{
public override virtual double value(){
return 100;
}
}
}

关于c# - 具有内部类对象的抽象类构造函数继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29254346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com