1. ホーム
  2. c#

[解決済み】インターフェイス - ポイントは何ですか?

2022-03-29 17:18:13

質問

インターフェースの存在意義がよくわからないのですが。私の理解では、C#には存在しない多重継承の回避策のようなものです(と、私は聞きました)。

私が思うに、いくつかのメンバーや関数をあらかじめ定義しておき、それをまたクラスで再定義しなければならないということです。そのため、インターフェースは冗長になっています。私には構文的な...いや、ガラクタのように感じられます(悪気はないのですが、ガラクタというのは役に立たないものという意味です)。

スタックオーバーフローのC#インターフェースのスレッドから引用した以下の例では、インターフェースの代わりにPizzaという基底クラスを作成します。

簡単な例 (別のスタックオーバーフローの投稿から引用)

public interface IPizza
{
    public void Order();
}

public class PepperoniPizza : IPizza
{
    public void Order()
    {
        //Order Pepperoni pizza
    }
}

public class HawaiiPizza : IPizza
{
    public void Order()
    {
        //Order HawaiiPizza
    }
}

解決方法は?

ポイントは、インターフェイスが表す コントラクト . 実装クラスが持つべきパブリックメソッドのセットです。技術的には、インターフェースは構文のみを規定します。つまり、どのようなメソッドがあり、どのような引数を得て、何を返すのかを規定します。通常、インターフェイスはセマンティクスもカプセル化しますが、それはドキュメントによってのみです。

そして、あるインターフェイスの異なる実装を持ち、それらを自由に入れ替えることができます。この例では、すべてのピザのインスタンスが IPizza を使用することができます。 IPizza 未知のピザ型のインスタンスを処理する場合、どこでもよい。を継承したインスタンスは IPizza は注文可能であることが保証されています。 Order() メソッドを使用します。

Pythonは静的型付けをしないので、型は保持され、実行時にルックアップされます。そのため Order() というメソッドがあります。ランタイムは、そのオブジェクトがそのようなメソッドを持っている限りは満足し、そうでない場合は、おそらく「メー」と肩をすくめるだけだろう。C#ではそうではない。コンパイラは正しい呼び出しを行う責任があり、もし適当な object 実行時にインスタンスがそのメソッドを持つかどうか、コンパイラはまだ知らないのです。コンパイラからすれば、それを検証できないので無効なのだ。(このようなことは、リフレクションや、あるいは dynamic というキーワードがありますが、今はちょっと遠回りしていますね)

また、通常の意味でのインターフェースは、必ずしもC#の interface これは、すべてのサブクラスが共通のコードを共有する必要がある場合に便利です - ほとんどの場合、しかし。 interface で十分です)。