2012-02-20 11 views
3

時々私たちは二つの異なる理由のためのインタフェースと抽象クラスを持っていることを疑問に思う:あなただけの設計目的と何かにのための複数の実装が必要な場合クラス階層の設計 - インタフェース+基底クラス対抽象クラス

  1. 開発時のコードと比較して、インタフェースは私たちが持っている最良の選択です。

  2. コードを再利用する場合は、抽象クラスを使用することもできます。

しかし、私はどちらも見ていません。

デザインによっては、これはInterface > BaseClass > Childクラスのようなものです。

基本的に基本クラスはすべてのメソッドを実装し、子クラスはそれから定義を継承します。このセットアップの代わりに抽象クラスを使用できないのはなぜですか?または、これは欠陥のある設定ですか?

答えて

9

オブジェクトがIS-A関係を持っていて、(抽象的な)基本クラスを使用している場合、最も単純な再考があります。馬のように動物です。

CANリレーションがある場合、Duck CANが飛ぶ場合のように、飛行できるアヒルのインターフェイスとしてIFlyingを使用するようなインターフェイスについて考えてください。

+1

これは覚えやすい簡単な解答です –

3

インターフェイスを使用して、複数のインターフェイスを1つのクラスに実装できます。 C#では複数のクラスから派生することはできません。

2

これは、C#ではクラスの多重継承が禁止されているためです。しかし、複数のインターフェースを実装することは許されています。

3

これはデザインや個人的な好みの問題です。通常、インターフェイスを宣言するときに、特定の実装を気にする必要はありませんが、インターフェイスで提供する必要があるラップされた機能には注意してください。

抽象クラスを持つと、特定の動作が定義されますが、これは常に望ましくないものです。

同時に抽象クラスを使用すると、複数のクラスを継承することを禁じることができます。そのため、持つことができる機能が制限されます。

クラス階層を設計するときは、「この状況で使用するオブジェクトは何ができるのですか?その機能のためのインタフェースを定義すると、実装を提供している間に、その機能のいくつかをグループ化して、いくつかの子クラスに対して再利用する必要があることに気付くことができます。

2

インターフェイスは本質的に機能性の契約です。特定のメソッドとプロパティを指定します。実装の詳細を知らなくても、このインタフェースに対してコードのセクションを書くことができます。

抽象クラスは、いくつかのインターフェイスを実装することができますが、すべての派生型に必要な共通の機能もいくつか含めることができます。また、派生型が一部の機能をカスタマイズできるようにする抽象メソッドまたは仮想メソッド/プロパティも含まれます。

インタフェースを使用してモデルを構築し、モデルの構造を定義するいくつかのオブジェクトモデルを構築するシナリオを考えてみましょう。ただし、そのコードのコンシューマは、コアデザインに影響を与えます。その後、1つの実装に対して基本クラスを使用して独自の実装を構築できます。派生型は、この基本クラスを継承します。この基本クラスは、オブジェクトモデルのインターフェイスを実装します。他の誰かが独自の実装を記述して書くことができますが、既存の実装とは異なる機能や動作が必要な場合があります。そのため、共通の機能を持つ独自の基本クラスを作成し、独自の派生型で拡張します。

このシナリオに従うと、抽象クラスとインターフェイスの両方を使用するべきではない本当の理由はありません。それは目的とコードの構築方法によって異なります。

2

インターフェイスは、クラスが実装しなければならない一連の属性と機能を定義し、任意の数のクラスによってインプリメントできます。基本クラスがインタフェースを実装してはならない理由はありません。たとえば、多くの異なる基本クラスがIComparableを使用する可能性があります。

0
インタフェース用

主規則はすべての方法は、インタフェースがインタフェース

  • の任意の数を拡張することができる
  • すべてのフィールドは、
  • 、パブリック静的最終的なあるべきではありません実装
  • 抽象的であるべきである

    1. あります
    2. 継承されたクラスですべてのメソッドをオーバーライドする必要があります
    +0

    これはC#スレッドなので、何かがインターフェースであることを宣言するとIDEによって強制されます。 – Void

    関連する問題