【发布时间】:2011-04-21 15:06:34
【问题描述】:
我有一个抽象基类
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 - 这是不可能的,因为它是一个实例属性。
除了在实例和静态级别上实现相同的属性之外,还有其他方法吗?那感觉就像是重复违反 DRY 编程风格。
新编辑:我现在看到这两种解决方案:
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 ..."; } }
}
有了这个,我可以处理Base 类型的任何object,比如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 的每个孩子都必须有一个不带参数的默认构造函数,并且我们会因为不必要的创建实例而降低性能。
还有其他想法吗?你更喜欢哪一个?为什么?
【问题讨论】:
-
呃...
public static abstract和public static override.....?这不会编译......没有关键字class的类也不会。在问题得到澄清之前,我认为我们无法提供明智的答案 -
你对实现实例属性有什么看法?
-
公共静态覆盖?我有一种不应该编译的感觉..
-
你是对的,到目前为止我还没有进入编译步骤。我将编辑问题。
标签: c# inheritance static-members