派生类 在其自己的静态方法中调用基类的静态方法



我已经通读了以下SO文章

  • C#:如何从派生类的静态方法调用基类的静态方法?
  • 我是否可以拥有一个基类,其中每个派生类都有自己的静态属性副本?
  • 静态方法继承的正确替代方法是什么?

所有这些似乎都非常接近我的问题并且有很好的答案,但他们似乎没有回答我的问题,只是说我需要使该方法非静态。

举个例子:

abstract public class baseClass
{
    private static List<string> attributeNames = new List(new string {"property1","property2"});
    // code for property definition and access
    virtual public static bool ValidAttribtue(string attributeName)
    {
        if (attributeNames.Contains(attributeName))
            return true;
        else
            return false;
    }
}
class derivedA : baseClass
{
    private static List<string> attributeNames = new List(new string {"property3","property4"});
    // code for property definition and access
    public static override bool ValidAttribute(string attributeName)
    {
        if (attributeNames.Contains(attributeName))
        {
            return true;
        }
        else
        {
            return base.ValidAttribute(attributeName);
        }
    }
}
class derivedB : baseClass
{
    private static List<string> attributeNames = new List(new string {"property10","property11"});
    // code for property definition and access
    public static override bool ValidAttribute(string attributeName)
    {
        if (attributeNames.Contains(attributeName))
        {
            return true;
        }
        else
        {
            return base.ValidAttribute(attributeName);
        }
    }
}

derivedA 将具有属性 1,2,3,4,而 derivedB 将具有属性 1,2,10,11。属性列表似乎是特定于类的值,任何时候都无法更改。 我认为这将是静态的。

我的设计是否错误,因为我试图在不应该使用静态方法时使用静态方法?

上面的例子让我认为需要继承静态方法,但似乎尝试这样做是一个设计缺陷。 谁能帮助我理解以这种方式编码或构建类有什么问题?

我的设计是否错误,因为我试图在不应该使用静态方法时使用静态方法?

是的。除此之外,您还尝试将静态方法声明为 virtual(然后重写它),这是不允许的。您还尝试声明一个名为 base 的类,当这是一个关键字时。

静态方法根本不是多态的。多态性的基础是所涉及的实例的执行时间类型可以不同于表达式的编译时类型,并且根据执行时间类型选择实现。该概念对于静态方法没有意义,因为没有实例。

现在,当然您可以使派生类中的静态方法调用基类中的静态方法 - 但是任何地方都不会有任何多态性。

作为旁注,您的所有方法都可以以更易读的方式编写:

// Base class implementation
return attributeNames.Contains(attributeName);
// Derived class implementations
return attributeNames.Contains(attributeName) ||
       BaseClass.ValidAttribute(attributeName);

最新更新