C#每个继承类的静态实例成员

时间:2011-11-15 20:32:03

标签: c# inheritance static

考虑以下示例:

interface IPropertyCollection
{
    public MethodWrapper GetPropertySetterByName(string name);
    //<<-- I want the implementation from A and B merged into here somehow
}
class A : IPropertyCollection
{
    static PropertyMap properties = new PropertyMap(typeof(A));
    public MethodWrapper GetPropertySetterByName(string name)
    {
        return properties.SomeFunc(name);
    }
}
class B : IPropertyCollection
{
    static PropertyMap properties = new PropertyMap(typeof(B));
    public MethodWrapper GetPropertySetterByName(string name)
    {
        return properties.SomeFunc(name);
    }
}

我希望每个类中都有一个静态成员来跟踪该类中的事物,我希望它对每个类的行为完全相同,但内容不同。每个静态成员应该只跟踪一个单独的类。我希望能够访问课程&#39;只有一个IPropertyCollection实例的静态成员。

这样的事情:

    IPropertyCollection a = new A();
    IPropertyCollection b = new B();
    a.GetPropertySetterByName("asdfsj");  //Should end up in static A.properties 
    b.GetPropertySetterByName("asdfsj");  //Should end up in static B.properties 

现在这将适用于我的示例代码,但我不想重复A和B以及其他50个类中的所有这些行。

2 个答案:

答案 0 :(得分:6)

使用(奇怪的重复)通用公共基类:

abstract class Base<T> : IPropertyCollection where T : Base<T> {
  static PropertyMap properties = new PropertyMap(typeof(T));
  public MethodWrapper GetPropertySetterByName(string name) {
      return properties.SomeFunc(name);
  }
}

class A : Base<A> { }
class B : Base<B> { }

由于基类是通用的,因此将为每个不同的类型参数“生成”其静态成员的不同“版本”。

小心evil dogs: - )

class Evil : Base<A> { } // will share A's static member...

答案 1 :(得分:4)

Static members无法继承。他们属于他们宣布的阶级。