Zoo*_*Way 0 c# inheritance static-members
我有一个抽象的基类
public class Base
{
public abstract String Info { get; }
}
Run Code Online (Sandbox Code Playgroud)
和一些孩子.
public class A : Base
{
public override String Info { get { return "A does ..."; } }
}
public class B : Base
{
public override String Info { get { return "B does ..."; } }
}
Run Code Online (Sandbox Code Playgroud)
这只是一个常数,但我想确保使用Base
所有类实现它.
现在我有时没有对象实例但想要访问A.Info
- 这是不可能的,因为它是一个实例属性.
除了在静态级别上实例AND上实现相同属性之外,还有其他方法吗?这将是一个重复违反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 ..."; } }
}
Run Code Online (Sandbox Code Playgroud)
有了这个我可以做任何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"; } }
}
Run Code Online (Sandbox Code Playgroud)
由于抽象,Base
它确保ClassInfo
始终实现.用电话obj.ClassInfo
和Base.GetClassInfo<A>()
都还好.但是有了这个,每个子节点都Base
必须有一个没有参数的默认构造函数,并且我们在不必要的创建实例中放松了性能.
还有其他想法吗?你更喜欢哪一个?为什么?
如果您需要静态属性的特定返回结果,那么您也可以更好
a)实例属性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"; } }
}
Run Code Online (Sandbox Code Playgroud)
如果您想要去属性路线,可以将其定义为:
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class InfoAttribute : Attribute
{
public InfoAttribute(string info) { this.Info = info; }
public string Info { get; private set; }
}
[InfoAttribute(Info = "From Base")]
public class Base
{
public string GetInfo()
{
var attr = GetType()
.GetCustomAttributes(typeof(InfoAttribute), true)
.FirstOrDefault();
return (attr == null) ? null : attr.Info;
}
}
[InfoAttribute(Info = "From A")]
public class A : Base { }
Run Code Online (Sandbox Code Playgroud)
如果您想将其称为静态函数调用,则可以进行此更改:
public static string GetInfo(Base instance)
{
var attr = instance.GetType()
.GetCustomAttributes(typeof(InfoAttribute), true)
.FirstOrDefault();
return (attr == null) ? null : attr.Info;
}
Run Code Online (Sandbox Code Playgroud)
然后将其称为:Base.GetInfo(instance);
.总而言之,不是很优雅!