5

我已阅读以下 SO 文章

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

一个例子:

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。属性列表似乎是特定于类的值,不能在任何时候更改。我认为它会是静态的。

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

上面的例子让我觉得需要继承静态方法,但似乎尝试这样做是一个设计缺陷。任何人都可以帮助我理解以这种方式编码或构造类有什么问题吗?

4

1 回答 1

8

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

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

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

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

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

// Base class implementation
return attributeNames.Contains(attributeName);

// Derived class implementations
return attributeNames.Contains(attributeName) ||
       BaseClass.ValidAttribute(attributeName);
于 2012-06-22T22:42:35.763 回答