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