C # члены статического экземпляра для каждого унаследованного класса - PullRequest
1 голос
/ 16 ноября 2011

Рассмотрим следующий пример:

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);
    }
}

Я хочу, чтобы в каждом классе был статический член, отслеживающий только вещи в этом классе, и я хочу, чтобы он вел себя одинаково для каждого класса, но с разным содержанием. Каждый статический член должен отслеживать только один отдельный класс. Я хочу иметь возможность получить доступ к статическому члену классов, просто имея экземпляр любого 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 ]

6 голосов
/ 16 ноября 2011

Используйте (странно повторяющийся) общий базовый класс:

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> { }

Поскольку базовый класс является универсальным, для каждого параметра другого типа будет «генерироваться» другая «версия» его статических членов.

Только будь осторожен с злыми собаками : -)

class Evil : Base<A> { } // will share A's static member...
4 голосов
/ 16 ноября 2011

Статические члены не могут наследоваться.Они принадлежат к классу, в котором они объявлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...