Вызывать константное свойство в классе как статическое? - PullRequest
0 голосов
/ 21 апреля 2011

Я получил абстрактный базовый класс

public class Base
{
  public abstract String Info { get; }
}

и некоторые дети.

public class A : Base
{
  public override String Info { get { return "A does ..."; } }
}

public class B : Base
{
  public override String Info { get { return "B does ..."; } }
}

Это просто константа, но я хочу убедиться, используя Base, что все классы реализуют ее.

Теперь у меня иногда нет экземпляра объекта, но я хочу получить доступ к A.Info - это невозможно, поскольку это свойство экземпляра.

Есть ли другой способ, кроме реализации того же свойства в экземпляре И на статическом уровне? Это было бы похоже на дублирующий нарушающий СУХОЙ стиль программирования.


НОВОЕ РЕДАКТИРОВАНИЕ : Теперь я вижу два решения:

public class Base
{
  public abstract String ClassInfo { get; }
}

public class A : Base
{
  public override String ClassInfo { get { return Info; } }

  public static String Info { get { return "A does ..."; } }
}

public class B : Base
{
  public override String ClassInfo { get { return Info; } }

  public static String Info { get { return "In B we do ..."; } }
}

С этим я могу сделать с любым object типа Base что-то вроде object.ClassInfo, но также использовать значение в моем заводском кодировке как if(A.Info) return new A(). Но мне нужно реализовать два свойства для одной и той же информации в каждом классе.

С другой стороны:

public class Base
{
  public abstract String ClassInfo { get; }

  public static String GetClassInfo<T>() where T : BaseControl, new()
  {
    T obj = new T();
    return obj.ClassInfo;
  }
}

public class A : Base
{
  public override String ClassInfo { get { return "text A"; } }
}

public class B : Base
{
  public override String ClassInfo { get { return "text B"; } }    
}

Из-за абстрактного Base гарантируется, что ClassInfo всегда реализуется. Звонки с obj.ClassInfo и Base.GetClassInfo<A>() в порядке. Но с этим у каждого потомка Base должен быть конструктор по умолчанию без аргументов, и мы теряем производительность с ненужным созданным экземпляром.

Есть еще идеи? Какой из них вы бы предпочли и почему?

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

Если вам нужны конкретные результаты возврата ваших статических свойств, вам лучше либо

а) Свойства экземпляра 2) Атрибуты

В приведенном вами примере у вас есть экземпляр Base, что означает, что вы можете просто сделать свойство экземпляра виртуальным:

public class Base
{
    public virtual string Info { get { return "From Base"; } }
}

public class A : Base
{
    public override string Info { get { return "From A"; } }
}

Если вы хотите пройти маршрут атрибута, вы определяете его так:

* * 1010

Если вы хотите вызвать его как статический вызов функции, вы можете внести это изменение:

public static string GetInfo(Base instance)
{
    var attr = instance.GetType()
        .GetCustomAttributes(typeof(InfoAttribute), true)
        .FirstOrDefault();

    return (attr == null) ? null : attr.Info;
}

А затем назовите его так: Base.GetInfo(instance);. В общем, не очень элегантно!

3 голосов
/ 21 апреля 2011

Это невозможно.
static члены не могут быть виртуальными или абстрактными.

Вы должны сделать абстрактное свойство экземпляра.

0 голосов
/ 21 апреля 2011

Скомпилировано? Я так не думаю. Статические нельзя пометить как переопределенные, виртуальные или абстрактные.

0 голосов
/ 21 апреля 2011

Статика не может быть переопределена. Если вы действительно хотите сделать что-то подобное, вам нужно, чтобы свойство экземпляра было виртуальным в базе, которое переопределялось в подклассах.

...