2012-02-11 12 views
8

抽象クラスまたはインタフェースのどちらかを選択するには2通りの方法があります。マイクロソフトのソリューションとOracleソリューション:抽象クラスまたはインタフェース。正しい方法は?


マイクロソフト、設計指針は:

は、クラスの代わりに、実装から契約を切り離すためのインタフェース(Visual BasicではMustInherit)抽象を使用しています。

http://msdn.microsoft.com/en-us/library/ms229013.aspx


オラクル、Javaのチュートリアル:

抽象クラスは、抽象メソッド宣言が含まれている場合は、代わりに、インタフェースとして宣言されなければなりません。

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html


私の質問が正しいどっちですか?マイクロソフトかオラクルのソリューションですか?私は、抽象クラスかインタフェースのどちらかをプログラミング言語(JavaまたはC#)に依存しないでください。

答えて

10

ブログを正しく読んでいると思いますが、抽象クラスを使用するためのMicrosoftのアドバイスは、インターフェイスではできない抽象クラスで実装を再利用することができます。

リンク先のMicrosoftページは、特に複数のプロジェクトにまたがって共有/再利用するためのコードライブラリを作成するためのガイダンスです。このような状況の可能性は、おそらく同じアセンブリ内で、インターフェイスのすべての実装を自分で記述することになります。単一の製品またはシステムで作業するための良いプラクティスは多少異なります。私は多くの言語でコードベースの数全体で見てきた

1つの一般的なアプローチはこれです:

  • が提供する契約を実装する抽象クラスを作成し、契約
  • を指定するためのインタフェースを定義しますすべての子孫にとって有益な共通の実装
  • 契約の実装では、便宜のために基本クラスから開始するか、完全に制御したい場合にのみインタフェースを実装するかを選択できます。

.NETの世界で共通する第4のステップは、インターフェイス上に構築された便利な拡張機能を提供することです。

+0

+1「単一の製品またはシステムでの作業の良い実践は多少異なるでしょう」 –

1

インターフェイスは実装されていません。これは契約です。完全なデカップリングが可能です。

いくつかの共通の実装を提供したい場合は、インタフェースから抽象(基本)クラスに移りますが、継承するクラス具体クラスを強制しながら、そのクラス固有の実装を提供します。これはデカップリングを少し少なくします。

また、C#(およびVB.netなどの.net言語など)やJavaでは、複数の継承が許可されていないため、インターフェイスがクラスに多くの動作を許可する方法になっていることに注意してください。

7

これは、異なるコンテキストの2つのステートメントです。

あなたが引用しているMicrosoftのガイドラインは、「クラスライブラリの設計」です。そして、そこに抽象クラスを好む理由を述べています。何も壊さずに機能を追加することができます。

レイヤーやその他の境界を分離して切り離すために、マイクロソフトはインターフェイスもアドバイスします。

+0

+1 - 明確な説明... – bryanmac

+0

+1 - これはMicrosoft推奨の主要な理由を示しています。 – Joe