像static一样在类上调用常量属性?

时间:2011-04-21 15:06:35

标签: c# inheritance static-members

我有一个抽象基类

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 - 这是不可能的,因为它是一个实例属性。

除了在静态级别的实例AND上实现相同属性之外,还有其他方法吗?这将是一种违反DRY编程风格的重复。


NEW EDIT :我现在看到这两个解决方案:

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 Baseobject.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的来电是可以的。但是,{{1}}的每个子节点都必须有一个没有参数的默认构造函数,并且我们会在不必要的创建实例中放松性能。

还有其他想法吗?你更喜欢哪一个?为什么?

4 个答案:

答案 0 :(得分:5)

如果您需要静态属性的特定返回结果,那么

更好

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

如果你想去属性路线,你可以这样定义:

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

如果您想将其称为静态函数调用,则可以进行此更改:

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

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

然后将其称为:Base.GetInfo(instance);。总而言之,不是很优雅!

答案 1 :(得分:3)

这是不可能的。
static成员不能是虚拟或抽象的。

你应该创建一个抽象的实例属性。

答案 2 :(得分:0)

无法覆盖静力学。如果你真的想要做类似的事情,你需要一个在基类中虚拟的实例属性,它在子类中被覆盖。

答案 3 :(得分:0)

它编译了吗?我不这么认为。静态不能标记为覆盖,虚拟或抽象。