いくつかの実際の例-また、インターフェースを使用する別の方法/理由。
私自身のコードには、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();
}