从派生类更改值

时间:2011-08-11 05:34:46

标签: c# oop inheritance

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;

FieldDerivedA类中DerivedB的值发生更改的情况下,Field类中BaseClass的值不是改变。因此,baseField的值仍为1

  • 是否可以从派生类中更改类FieldBaseClass的值?
  • 这个场景是否有设计模式,它叫什么?

4 个答案:

答案 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。 此方案是否有设计模式及其名称?

是的,它被称为对象继承