Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在类上调用常量属性,比如static?_C#_Inheritance_Static Members - Fatal编程技术网

C# 在类上调用常量属性,比如static?

C# 在类上调用常量属性,比如static?,c#,inheritance,static-members,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 ...

我得到了一个抽象基类

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时所有类都实现它

现在,我有时没有对象实例,但希望访问.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 ..."; } }
}
有了这个,我可以处理任何Base类型的对象,比如object.ClassInfo,但也可以使用工厂中的值,比如ifA.Info返回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"; } }    
}
由于抽象的基础,它确保始终实现ClassInfo。使用obj.ClassInfo和Base.GetClassInfo的调用都可以。但有了这一点,Base的每个子级都必须有一个没有参数的默认构造函数,并且我们使用不必要的创建实例降低了性能

还有其他想法吗?您喜欢哪一种?为什么?

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


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

静态不能被重写。如果您真的想做类似的事情,那么您需要一个在基类中是虚拟的、在子类中被重写的实例属性

它被编译了吗?我不这么认为。静态不能标记为重写、虚拟或抽象。

如果您需要静态属性的特定返回结果,您最好选择其中一种

实例属性 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.GetInfoinstance;。总而言之,不是很优雅

呃。。。公共静态抽象和公共静态重写。。。。。?那不会编译。。。没有关键字class的类也不会。在问题澄清之前,我认为我们无法提供合理的答案。您反对实现实例属性的理由是什么?公共静态覆盖?我有一种不应该编译的感觉..你是对的,到目前为止我还没有进入编译步骤。我将编辑这个问题。这不是一个非常有用的答案。所以。。。你复制了一块SLaks的答案。。。恐怕这不会使它更有用。试着在讨论中提出一个新的想法。我真不敢相信你这么快就复习了我的答案。谢谢。实例属性可以工作,但我需要关于实例和类级别的相同信息。什么是最佳实践?加倍是唯一的解决办法吗?这很有趣。可以像objectA.GetInfo和A.GetInfo一样调用该信息吗?它是一个实例方法,另一种方法是将其设置为静态函数,并传入基本实例。我将更新这个示例。问题是,通过编写A.GetInfo,静态调用应该可以在没有实例的情况下进行。我将尝试使用一个具有实际常量值的静态属性,并在Base中使用一个实例属性,该属性通过反射调用静态属性。由于该实例,我对您的静态GetInfo不满意。但是我在问题中发布的第二个解决方案通过一个泛型类型参数解决了这个问题。现在我将把属性方法与实例GetInfo和静态GetInfo结合起来。如果你的答案有效,我会把它标记为解决方案。它对我有效。我将静态GetInfo作为一个泛型方法来给它类型,而不给它实例。我并行执行了一个实例GetInfo。编译和单元测试都很满意,谢谢!