这里有一些示例代码来解释我想要做的事情:
首先,我有一个基类:
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.我怎么能意识到这个或者有没有设计模式?
可能很容易,但我找不到解决方案。我需要几个子类和一个基本类,它们是单例或类似的东西......
答案 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)
此处有两个不同的对象,由变量a
和b
引用。它们都是同一基类的子类的事实是无关紧要的。要改变一个以影响另一个,他们要么必须彼此了解,要么都知道其他一些共同的对象。例如,您可以拥有:
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或基类的任何其他实例。