抽象クラスとインターフェースの両方を持つことには利点がありますか?

StackOverflow https://stackoverflow.com/questions/267045

質問

私はILoginと呼ばれる一般的なインターフェイスから始めました。インターフェイスには、UserIDとPasswordの2つのプロパティを実装する必要があります。このインターフェイスを実装する多くのログインタイプのクラスがあります。私のプロジェクトが成長するにつれて、多くのクラスがUserIDとPasswordコードを繰り返していることがわかりました。ここで、基本のLoginクラスが必要であると判断しました。

ILoginインターフェイスを実装する抽象基本Loginクラスを作成し、すべての具象クラスを抽象クラスから継承し、必要に応じてオーバーライドするのは適切ですか?もともとこれで問題ないだろうと思っていました。それから、ILoginはおそらく抽象クラスによってのみ実装される可能性があるため、おそらく不要であると考え始めました。

抽象クラスとインターフェイスの両方を保持することには利点がありますか?

ありがとう!

役に立ちましたか?

解決

間違いなく。具体的な例を考えてみましょう。

抽象クラス Animal があるとします。 たとえば、 Cat Dog Mosquito 、および Eagle というサブクラスを作成します。抽象クラス Animal Eat() Breathe() Sleep()メソッドを実装できます。

これまでのところ、とても良い。ここで、 Mosquito および Eagle クラスに Fly()メソッドを使用したいとします。これらの2つの生物は実際にはあまり関連していないため(1つは鳥で、もう1つは昆虫です)、抽象クラスとして持つことができる2つの共通の祖先を見つけるのは容易ではありません。これは、インターフェイス IFly によって実装するのが最適です。

IFly インターフェースには、実装する Fly()メソッドを含めることができます。 Mosquito クラスと Eagle クラスはどちらも抽象クラス Animal のサブクラスであり、インターフェイス IFly を実装して、 Eat() Breathe() Sleep()、および Fly()へ2つのクラス間の先祖関係。

他のヒント

私は通常、抽象クラスに対してコードを作成し、すべてのクラスのインターフェイスを抽象化して実装する(および外部コントラクトアセンブリ/ライブラリに作成する)ため、Windows Communication Foundationまたは制御の反転(必要に応じて)(ほとんどの場合はモック用)。これは私にとって第二の性質になりました。

もちろんです。インターフェースは常に正しい方法です。その方法で、何でも実装できます(既に親を持っているものを含む)。

抽象クラスは作成する傾向があるため、その機能の一部を再実装する必要はありません。 Swingはそれを少し使用します。5つのメソッドのうち1つだけをオーバーライドするためのインターフェースとデフォルトの実装があります。または、リスナーを追加する必要がありますが、その基本クラスを使用する必要はありません。したくない。

抽象クラスがインターフェイスを実装する only クラスである場合、抽象クラスのインスタンスをいつでも確認できます。インターフェイスは不要です。ただし、抽象クラスを拡張せずにインターフェイスを使用できる、まだ記述されていない新しいクラスと将来の互換性が必要な場合は、今すぐインターフェイスを使用してください。

cfedukeに同意します。私は常にインターフェイスから始め、過去にはインターフェイスを実装し、抽象クラスから継承するクラス間でコードの再利用を促進する基本的な機能を提供する抽象クラスを使用していました。モッキングとIOCは一般的にインターフェイスに依存しているため、この理由だけで、デザインでインターフェイスを使用します。

抽象クラスに機能がある場合、それを保持するのが賢明です。ただし、抽象メソッドのみが含まれ、フィールドが含まれていない場合。両方を保持することには意味がありません。

編集:多くの抽象クラスを含むレガシーコードに取り組んでいます。時間があれば、インターフェースを追加します(空の要約を削除することもあります)。インターフェースを使用すると、可能性が大幅に高まるためです。そして、インターフェースを正確に定義することで、彼らの名前を尊重します。

インターフェースは、オブジェクトを受け入れるために満たす必要がある契約を定義します。抽象クラスは、満たす必要がある契約を定義し、特定の実装の詳細を定義します。

このように考えてください。抽象クラスがスケッチする方法とは異なる方法で(たとえば、異なるバッキングデータ型実装を使用して)契約を履行することが誰でも可能であると考えている場合は、インターフェイスと抽象クラスの両方が必要です。それを実装します。

抽象クラスとインターフェイスの両方を使用することに伴うオーバーヘッドはほとんどありません。このアプローチのリスクは、主に、インターフェースを実装する抽象クラスがあることを認識せず、必要のないところから実装全体を一から作成する、後のコーダーがインターフェースを通過することです。これは、インターフェイスドキュメントで「デフォルト」があることを指定することで回避できると思います。抽象クラスでのインターフェイスの実装。一部のコーディング標準はその慣行に眉をひそめるかもしれませんが、実際の問題は見当たりません。

インターフェイスを使用することを常にお勧めします。抽象クラスには、デフォルトの機能を追加できるという利点がありますが、ユーザーが単一の継承を使用することを要求するのはかなり積極的です。

Microsoftクラスライブラリは、基になるクラスを変更できるため、多くの場合、インターフェイスよりも抽象クラスを優先します。抽象クラスにメソッドを追加しても、それを継承する人が壊れることはほとんどありません。インターフェースにメソッドを追加すると、常にその実装者が壊れます。ただし、これはインターフェイスを使用する最大の理由の1つです。Microsoftが既に1つの継承を使い果たした可能性が非常に高いことです。

ただし、特定のケースでは、使用しているデザインパターンを再検討することをお勧めします。 「ログオンタイプ」がたくさんあるのは珍しいようです。クラス。

インターフェイスを保持する利点は、将来のクラスが複数のインターフェイスを実装できることです。一方、クラスは1つの抽象クラスからしか継承できません。

メソッドの異なるセットで新しいインターフェイスを作成することにより、サブクラスの機能を拡張できます。

インターフェイスと抽象クラスの署名が同一である場合を具体的に尋ねると仮定します...

...(インターフェイスのメンバーが抽象クラスのメンバーと何らかの点で異なる場合、もちろん答えはイエスです。両方が必要な場合があります)

...しかし、メンバーが同一であると仮定すると、両方が必要だと考えることができる唯一の理由は、複数の実装継承を許可しないシステムでコーディングしている場合です。多相的に類似しているが、異なる基本クラスから継承する必要がある...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top