更改派生类的值
本文关键字:派生 | 更新日期: 2023-09-27 18:05:17
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;
在本场景中,当DerivedA
和DerivedB
类中Field
的值发生变化时,BaseClass
类中Field
的值不会发生变化。因此,baseField
的值仍然是1
。
- 是否有可能改变
Field
的值在类,BaseClass
从派生类? - 这个场景有设计模式吗?它叫什么?
当你实例化每个对象时,它在堆中创建自己的内存,直到它扎根,即对象类。并且每个类的所有成员都是在stack中创建的(如果它的valuetype)。
首先,可能的解决方案是:在基类中通过子类static
更改您想要的字段。我不确定这是否真的会给你你所期望的行为,因为它不清楚这种行为是什么。如果这样做,每个实例将共享相同的值。
第二,这一切都不清楚,因为(我认为)你在这里混淆了类和实例。
用一个很常见的比喻来说,这就是房子的蓝图和房子本身的区别。
你刚才问的问题是:如果我用蓝图Z造了一所房子,我打破了那所房子的一扇窗户,为什么用同样的蓝图造的新房子的窗户没有被打破?
这个比喻中的房子是实例(x
),蓝图是类(BaseClass
)。
你可以使字段在BaseClass静态得到你想要的(虽然我真的不能理解你想要实现什么)
1。 是否可以从派生类更改类中BaseClass字段的值?
您实际上已经在您的场景中这样做了,但它被最后一行代码隐藏(因为您正在实例化一个新对象,该对象将获得一个新的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。这个场景有设计模式吗?它叫什么?
是的,它被称为对象继承