更改派生类的值

本文关键字:派生 | 更新日期: 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;

在本场景中,当DerivedADerivedB类中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。这个场景有设计模式吗?它叫什么?

是的,它被称为对象继承