4

実装とインターフェースの基礎はすでに知っています。インターフェイスを使用するタイミングがわかりません。インターフェイスを持つための要件は何ですか?

例:

/// Interface demo
Interface IDemo
{
    // Function prototype
    public void Show();
}

// First class using the interface
Class MyClass1 : IDemo
{
public void Show()
{
    // Function body comes here
    Response.Write("I'm in MyClass");
}
}

// Second class using the interface
Class MyClass2 : IDemo
{
public void Show()
{
    // Function body comes here
    Response.Write("I'm in MyClass2");
    Response.Write("So, what?");
}
}

これら 2 つのクラスは、本体が異なる同じ関数名を持ちます。これは、インターフェイスなしでも実現できます。メソッド参照を持つ目的は何ですか? スーパークラスを拡張すると、少なくともスーパークラスのプロパティとメソッドを取得できます。

私がよく理解できるように、明確な説明と実際のシナリオを教えてください。

4

5 に答える 5

3

多重継承が必要な場合は、インターフェースが必要です。

Comparable であると同時に List である必要があるクラスがあるとします。一部の言語では 1 つのクラスしか継承できないため、Comparable の compareTo() メソッドと List の add() メソッドの両方があることをコンパイラに証明するには、インターフェイスが必要です。これは非常に簡単な説明ですが、他の人がもっと理由を挙げてくれると確信しています。

また、「バックグラウンドで」何も行われていないため、インターフェースによって多重継承が容易になる場合があります。メソッドに関してオブジェクトが提供する必要があるものを指定するだけです。

于 2013-04-11T01:29:11.427 に答える
1

インターフェイスを使用する最も重要な理由の 1 つは、型の一致だと思います。実装の代わりにインターフェイスにプログラミングすることで、プログラムをより柔軟にすることができます。

さまざまな設計パターンを見ることができます (戦略パターンから始めることをお勧めします。 http://en.wikipedia.org/wiki/Strategy_pattern#Example ) インターフェイスへのプログラムがコードをより柔軟にする方法をすぐに理解できると思います。

これが役立つことを願っています。

于 2013-05-12T12:16:44.353 に答える
0

この機能の多くは、オブジェクトがインターフェイス型の変数によって参照できるという事実からもたらされます。これは微妙に強力です。

private foo()
{
     IDemo demoOne = new MyClass1();
     IDemo demoTwo = new MyClass2();
}

さまざまな動作をカプセル化できるため、これは非常に強力になります。例えば:

private foo(bool option)
{
     IDemo demo = option ? new MyClass1() : new MyClass2();
}

private bar (IDemo demo)
{
     demo.Show();
}

これで、bar は IDemo のどの具体的な実装が渡されたかを知る必要なく、IDemo オブジェクトを使用できるようになりました。使用する実装に関する決定は、foo メソッドにカプセル化されています。このような単純な例では、これは大したことではないように思えるかもしれません。ティガーの回答に投稿されたリンクを見ると、これが非常に役立つ場所がわかります。

これが特に役立つケースの 1 つは、単体テストです。データ層オブジェクトへのインターフェイスを取るビジネス ロジック クラスを持つことができます。アプリケーションが実行されると、ビジネス ロジック クラスに実際のデータ レイヤー オブジェクトのインスタンスが渡されます。クラスが単体テストされると、テスト データを返すオブジェクトのインスタンスが渡されます。これにより、単体テストを予測可能なデータ入力で実行できます。これは Dependency Injection で知られています。

もう 1 つの便利なケースは、フレームワークまたはサードパーティ コードとやり取りする場合です。カスタム コレクションを実装するとします。クラスが IEnumerable インターフェイスを実装している場合は、foreach ループでコレクション内の項目を反復処理できます。フレームワークは、クラスがアイテムを格納する方法やアイテムの内容を知る必要はありませんが、IEnumerable を実装したことがわかっている場合は、foreach ループを使用できます。

于 2013-04-12T16:42:32.477 に答える