【问题标题】:Changing values from derived classes从派生类更改值
【发布时间】:2023-03-14 19:44:01
【问题描述】:
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

  • 是否可以在派生类BaseClass 类中更改Field 的值?
  • 是否有适用于这种场景的设计模式?它叫什么?

【问题讨论】:

  • 你为什么要给我们使用神秘名称的示例代码?你知道听你说的有多么困难吗?
  • 好的...... 20 分钟后,我已经重构并重新表述了所有内容......希望现在其他人应该更容易阅读。
  • 服务真好,@Jeff。人们应该更频繁地在这里用餐

标签: c# oop inheritance


【解决方案1】:

当你实例化每个对象时,它会在堆中创建自己的内存,直到它的根,即 Object 类。并且层次结构的每个类中的所有成员都是在堆栈中创建的(如果它的值类型)。

因此在每种情况下都不同。

【讨论】:

    【解决方案2】:

    首先,可能的解决方法是:通过基类中的子类static 更改您想要的字段。我不确定这是否真的会给您带来您期望的行为,因为目前尚不清楚这种行为是什么。如果您这样做,每个实例将共享相同的值。

    其次,这一切都不清楚,因为(我认为)您在这里将类与实例混淆了。

    用一个很常见的比喻来说,就是房子的蓝图和房子本身之间的区别。

    你刚才问的问题是:如果我用蓝图 Z 建造一所房子,然后我打破了那所房子的一扇窗户,为什么用同样的蓝图建造的新房子没有任何窗户被打破?

    这个比喻中的房子是实例(x),蓝图是类(BaseClass)。

    【讨论】:

    • 问题是在更改之后,代码无法再使用实例引用访问该成员,看起来 OP 真的想使用实例引用。
    • 你真的能够理解 OP 想要什么 :) 吗?
    【解决方案3】:

    您可以将 BaseClass 中的 Field 设为静态以获得您想要的(虽然我真的无法理解您想要实现的目标)

    【讨论】:

      【解决方案4】:

      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. 是否有这种场景的设计模式,它叫什么?

      是的,它叫做对象继承

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多