在类(如static)上调用constant属性

本文关键字:调用 constant 属性 static 在类 | 更新日期: 2023-09-27 17:52:17

我得到了一个抽象基类

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编程风格。


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 ..."; } }
}
有了这个,我可以做任何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.ClassInfoBase.GetClassInfo<A>()是可以的。但是这样Base的每个子类都必须有一个没有参数的默认构造函数,这样我们就会因为不必要的创建实例而损失性能。

还有别的主意吗?你更喜欢哪一个,为什么?

在类(如static)上调用constant属性

如果您需要静态属性的特定返回结果,您最好使用

a)实例属性2)属性

在你已经给出的例子中,你有一个Base的实例,这意味着你可以把实例属性设置为virtual:

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);。总之,不是很优雅!

这是不可能的。static成员不能是virtual或abstract。

静态不能被覆盖。如果你真的想做那样的事情,你会想要一个实例属性它在基类中是虚的在子类中被覆盖。

编译了吗?我不这么想。静态不能被标记为覆盖、虚拟或抽象。