如果两个类继承静态字段,那些类的对象是否会共享相同的值?

时间:2013-03-18 18:34:28

标签: c# inheritance

不同类的不同对象是否可以在它们之间使用一个共享项(例如,用于动态提供某些信息)或更好地在两个不同类的不同对象之间进行通信?

Class Base 
{
   public static string SomeThing = "Shared With All";
}
Class Der1 :Base
{
     public void DoSomeThing()
     {
          SomeThing = "SomeThing Goes in here...";
     }
}

Class Der2 :Base
{
     public void DoSomeThingElse()
     {
          Console.WriteLine"(SomeThing);
     }
}

....
{
    Der1 dr1 = new Der1();
    dr1.DoSomeThing();  
    Der2 dr2 = new Der2();
    dr2.DoSomeThingElse(); //shows 'SomeThing Goes in here...'  
}

如果它有所帮助,我正在尝试创建某种类型的设计器,因此我需要跟踪设计器上的所有控件及其关联。实际上目前只有两个对象(一个叫做事务,另一个称为地点,不同的地方可以与不同的交易相关联,这种关联是由用户点击一个地方并指向其他交易完成的(你有没有)看到Proteus?类似的东西。)

因此,这种方法将帮助我知道哪个对象引用了哪个其他对象,因此可以很容易地发现并保存两者之间的关联。

5 个答案:

答案 0 :(得分:5)

静态字段的确没有像普通字段那样继承。仍然只有一个静态字段Base.SomeThing。这两个派生类都引用相同的字段:如果任何更改Base.SomeThing访问该字段的所有将会看到更改。

答案 1 :(得分:1)

是的,你发明了一个全局变量:)它也几乎总是一个糟糕设计的标志。尝试以不同方式解决您的任务。

答案 2 :(得分:1)

有可能,但仔细考虑在课堂内以这种方式进行交流。没有好的方法可以解决并发问题,如果将值设置为多个位置,则很难调试。

答案 3 :(得分:1)

您可以使用static var或使用settergetter分享内容。这些是OOP中的基本运算符。

答案 4 :(得分:1)

静态字段属于声明它的类。该类的任何子类都可以访问该静态字段。

这里有一些警告。在Generic类上声明静态变量意味着该泛型的每个封闭类型都存在该变量的一个副本。这是一个澄清的例子

public class StaticGenericTest<T>
{
  private static int count=0;
  public StaticGenericTest()
  {
     count++;
  }
}

如果您实例化StaticGenericTest<int>StaticGenericTest<string>,他们会有不同的计数值。但是,StaticGenericTest<int>的子类将与StaticGenericTest<int>的所有其他子类共享计数。

此外,您将使用ThreadStatic属性获得有趣的行为(因为您将获得每个帖子的一个计数副本)和/或static constructors

正如有人提到的,静态字段是全局状态,应该受到保护,并谨慎使用。