class BaseClass
{
public int Field = 1;
}
class DerivedA : BaseClass
{
public int SetField6()
{
return this.Field = 6;
}
}
class DerivedB : BaseClass
{
public int SetField16()
{
return this.Field = 16;
}
}
BaseClass x = new BaseClass();
int xField = x.Field;
DerivedA y = new DerivedA();
int yField = y.SetField6();
DerivedB z = new DerivedB();
int zField = z.SetField16();
int baseField = new BaseClass().Field;
在Field
和DerivedA
类中DerivedB
的值发生更改的情况下,Field
类中BaseClass
的值不是改变。因此,baseField
的值仍为1
。
Field
中BaseClass
的值?答案 0 :(得分:1)
当你实例化每个对象时,它会在堆中创建自己的内存,直到它为根,即Object类。所有层次结构中的所有成员都是以堆栈形式创建的(如果是它的值类型)。
因此在每种情况下都不同。
答案 1 :(得分:1)
首先,可能是什么修复:使您想要的字段由基类中的子类static
更改。我不确定这是否真的会给你你期望的行为,因为目前还不清楚这种行为是什么。如果您这样做,每个实例将共享相同的值。
其次,这一点都不清楚,因为(我认为)你们在这里混淆了实例。
对于这个使用一个非常常见的比喻,它是房子蓝图和房子本身之间的区别。
你刚才提出的问题是:如果我从蓝图Z做一个房子,我在那个房子里打破了一扇窗户,为什么在同一个蓝图的新房子里没有任何窗户被打破?
这个比喻中的房子是实例(x
),蓝图是类(BaseClass
)。
答案 2 :(得分:0)
你可以让BaseClass中的Field静态得到你想要的东西(虽然我真的无法理解你想要达到的目的)
答案 3 :(得分:0)
1。 是否可以在派生类中更改类BaseClass中Field的值?
您实际上已经在您的场景中完成了这项工作,但它被最后一行代码隐藏(因为您正在实例化一个新对象,它将新的Field设置为1)。所以,而不是打电话:
int baseField = new BaseClass().Field;
使用此:
int baseField = y.Field; // baseField is now = 6 because Field was changed earlier by y.SetField6()
这样,您实际上可以看到基类成员Field的值已被从派生类构造的对象修改(实际修改是通过调用y.SetField6()完成的)。
2。 此方案是否有设计模式及其名称?
是的,它被称为对象继承。