0

私はOOPの概念を高度なレベルで学ぼうとしています。私はトピックインターフェイスを読んでいて、混乱しています。しかし、最初に、この混乱の正確な原因をお見せしましょう。このコードサンプル
をテストしました。しかし、私はインターフェースの使用と混同しています。そのコードを実装した後、インスタンスを作成するだけで、クラスAからメソッドDoFirstを呼び出すことができるように思えます。では、なぜそもそもインターフェースを使用するのでしょうか。

このようなもの:

A myA = new A();
myA.DoFirst();

同様に、

B myB = new B();
myB.DoFirst();

どちらのクラスでも、「DoFirst」というメソッドを実装する必要があるので、インターフェイスはどのようなメリットをもたらしますか?

これらのメソッドを自分で別のクラスに書くことはできませんか?

私の2番目の質問は、5つのメソッドを持つインターフェースがあるとしましょう。クラスがそれを実装し、インターフェイスによって提供される5つのメソッドすべてのコードを記述する代わりに、3つのメソッドの実装のみを提供したい場合。これはダメじゃないですか?なぜ私が望まないアクセス方法があるのですか?

誰かが例を挙げてこれらに答えることができますか(高く評価されています)?

4

3 に答える 3

3

あなたが提供したリンクですでに利点が指摘されています...基本的にあなたは書くこともできます

void DoSomething(IMyInterface obj)
{
    obj.DoFirst();
}

次に、そのインターフェイスをパラメータとして実装する任意のタイプのオブジェクトを送信します。

A myA = new A();
DoSomething(myA);
B myB = new B();
DoSomething(myB);

メソッドDoSomethigは、と呼ばれるインターフェイスを公開している限り、オブジェクトのタイプを気にしませんIMyInterface

于 2013-02-22T11:59:18.120 に答える
2

いくつかの実際の例-また、インターフェースを使用する別の方法/理由。

私自身のコードには、Excelでレポートを作成するためのコードを処理するエンジンがあります。このエンジンでは、2つの異なる方法でコードを作成する必要がありました。1つはMicrosoft Excel Interopを使用し、もう1つはOpenOfficeInteropを使用します。エンジン全体を複製して2つの異なる方法で動作させたり、実際のすべての相互運用機能に多くのifステートメントを記述したりするのではなく、インターフェイスを実装しました。次に、2つのクラスを宣言しました。それぞれがインターフェイスを実装していますが、1つはExcelを使用し、もう1つはオープンオフィスを使用しています。次に、私のコードでは、インターフェイスとその関数を単純に参照し、関数の最初にある単一のifステートメントを使用して、実装するクラスをインターフェイスに指示します。

public class ExcelEngineInterop : ISSinterface
{ ... }

public class OOEngineInterop : ISSinterface
{ ... }

//cant use two variables with the same name, so use 1 interface reference instead
ISSinterface ssInt;
if(ExcelFlag)
    ssInt = new ExcelEngineInterop();
else
    ssInt = new OOEngineInterop();

//two VERY different functions between Excel and OpenOffice.
ssInt.OpenApp();
ssInt.OpenFile(fileName);

//etc etc and so on

これが、インターフェースを使用するもう1つの理由です。外部フラグに応じて2つ(またはそれ以上)の異なる方法で動作するために1つのコードブロックが必要な場合。

もう一つの例。

その下に多くのカスタムユーザーコントロールを備えたトップレベルのフォームがあります。ユーザーはボタンクリックなどのフォームレベルのイベントを発生させますが、アクティブなユーザーコントロールと、クリックが発生したときにそれらに設定されている設定に応じて、コントロール自体が別のことを行う必要があります。それぞれがトップレベルから正しく動作することを確認するために、途方もなく多数のifステートメントになる可能性があるものを記述するのではなく、各コントロールにインターフェイスを実装してから、次のようにします。

public ButtonClick(object sender, EventArgs e)
{
    //note: I dont know which of my classes currentrightcontrol belongs to at the moment.
    //      it could be any one of 22 different controls. It must be cast to something
    //      in order to call the ButtonClick method (its actual type is generic "UserControl"

    IMyRunControl ctrl = CurrentRightControl as IMyRunControl;
    ctrl.FormButtonClicked();
}
于 2013-02-22T12:09:13.147 に答える
0

C#は静的に型付けされた言語です(少なくとも、明示的に指定しない限り)。これは、コンパイラが変数の型を使用して、参照されるオブジェクトに使用しようとしているメンバーが含まれているかどうかを知ることを意味します。

したがって、このインターフェースは、このクラスがそのインターフェースを実装するというコントラクトをコンパイラー(および他のプログラマーにも)に提供します。インターフェイスは階層関係のないクラス間で共有できるため、パラメータタイプでインターフェイスを定義することにより、オブジェクトを引数として取ることができるメソッドを定義できます。

于 2013-02-22T11:55:13.747 に答える