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

派生 A にはプロパティ 1、2、3、4 があり、派生 B にはプロパティ 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 に答える