C# ではなぜ静的メソッドでインターフェースを実装できないのでしょうか? 質問する

C# ではなぜ静的メソッドでインターフェースを実装できないのでしょうか? 質問する

C# はなぜこのように設計されたのでしょうか?

私の理解では、インターフェースは動作を記述するだけであり、インターフェースを実装するクラスに対して特定の動作が実装されるという契約上の義務を記述する目的を果たします。

クラスがその動作を共有メソッドで実装したい場合、なぜそうすべきではないのでしょうか?

私が考えている例は次のとおりです。

// These items will be displayed in a list on the screen.
public interface IListItem {
  string ScreenName();
  ...
}

public class Animal: IListItem {
    // All animals will be called "Animal".
    public static string ScreenName() {
        return "Animal";
    }
....
}

public class Person: IListItem {

    private string name;

    // All persons will be called by their individual names.
    public string ScreenName() {
        return name;
    }

    ....

 }

ベストアンサー1

なぜこれができないのかと尋ねていると仮定します:

public interface IFoo {
    void Bar();
}

public class Foo: IFoo {
    public static void Bar() {}
}

これは意味的に私には理解できません。インターフェースで指定されたメソッドは、オブジェクトと対話するための契約を指定するために存在する必要があります。静的メソッドでは、オブジェクトと対話することはできません。実装を静的にできる状況にある場合は、そのメソッドが本当にインターフェースに属するかどうかを自問する必要があるかもしれません。


あなたの例を実装するには、Animal に const プロパティを与え、静的コンテキストからアクセスできるようにし、実装でその値を返します。

public class Animal: IListItem {
    /* Can be tough to come up with a different, yet meaningful name!
     * A different casing convention, like Java has, would help here.
     */
    public const string AnimalScreenName = "Animal";
    public string ScreenName(){ return AnimalScreenName; }
}

より複雑な状況では、別の静的メソッドを宣言して、それに委任することもできます。例を挙げようとしても、静的コンテキストとインスタンス コンテキストの両方で重要なことを行う理由が思いつかなかったので、FooBar の塊は省略し、それが良い考えではないかもしれないという兆候として受け止めます。

おすすめ記事