1. ホーム
  2. c#

[解決済み] なぜC#は静的メソッドにインターフェイスを実装できないのか?

2022-03-22 03:06:51

質問

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

    ....

 }

解決方法は?

なぜできないのか、という質問を想定して。

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の塊は割愛し、良いアイデアではないことを示すものとします。