C#是否可以为不同的子类实例使用基类的实例?

时间:2011-04-07 18:43:36

标签: c# .net oop polymorphism

这里有一些示例代码来解释我想要做的事情:

首先,我有一个基类:

    public class BaseClass {
      int k = 100;
    }

这里有两个子类:

public class SubClassA : BaseClass {}
public class SubClassB : BaseClass {}

当我创建SubClassA的实例并更改k的值时,我想访问SubClassB实例中的更改值。这就是我的意思:

public class TestClass {
 public void doSomething() {
  SubClassA a = new SubClassA();
  SubClassB b = new SubClassB();

  a.k = 500;

  int j = b.k;
 }
}

通常j的值为100,但我希望它的值已经改变了500.我怎么能意识到这个或者有没有设计模式?

可能很容易,但我找不到解决方案。我需要几个子类和一个基本类,它们是单例或类似的东西......

4 个答案:

答案 0 :(得分:4)

您必须使k成为静态变量才能在所有实例中保留相同的值。

public class BaseClass
{
    public static int k = 100;
}

答案 1 :(得分:3)

您可以通过使基类字段/属性为static来实现:

public class BaseClass {
   protected static int k = 100;
}

这会导致字段与BaseClass类型相关联,而不是特定实例 - 因此,它将在所有子类实例中“共享”。

答案 2 :(得分:1)

此处有两个不同的对象,由变量ab引用。它们都是同一基类的子类的事实是无关紧要的。要改变一个以影响另一个,他们要么必须彼此了解,要么都知道其他一些共同的对象。例如,您可以拥有:

public class Int32Holder
{
    public int Value { get; set; }
}

class Foo
{
    private readonly Int32Holder valueHolder;

    public int Value
    {
        get { return valueHolder.Value; }
        set { valueHolder.Value = value; }
    }

    public Foo(Int32Holder valueHolder)
    {
        this.valueHolder = valueHolder;
    }
}

然后:

Int32Holder holder = new Int32Holder();
Foo a = new Foo(holder);
Foo b = new Foo(holder);
a.Value = 10;
Console.WriteLine(b.Value); // Prints 10

但是,我建议这一点......这会造成相当混乱的行为。

对于你想要完成的事情几乎肯定有更好的设计模式 - 但除非你告诉我们更大的图景,否则我们无法帮助你。

我建议反对使用其他答案显示的静态变量,除非你真的,真的希望变量与类型相关联,而不是与任何类型的实例相关联。

答案 3 :(得分:0)

没有

你能解释现实世界的情景吗?

在您的示例中,a和b是差异实例。它们每个都有一个独立的k,每个都可以改变它,但只是因为它们是同一个东西的子类,它们并没有“链接”在一起。

如果基类有一个静态成员,它可以被更改,但它将被全局更改,不仅仅是这个a和b,而是子类a,b或基类的任何其他实例。