19

重複インターフェイスと基本クラス


私は OOP、デザイン パターン、アクション スクリプト 3 の世界に深く入り込んでいますが、Abstract クラス (Abstract クラスをサポートしていない AS3 の擬似) とインターフェイスをいつ使用するかを知る方法にまだ興味があります。私にとって、どちらも特定のメソッドが特定のクラスに実装されていることを確認するテンプレートとして機能します。違いは、Abstract クラスには継承が必要であり、Interface は単に拡張するだけであるという事実だけですか?

ありがとう、ブライアン・ホッジ hodgedev.com

4

3 に答える 3

34

サブクラスに必要な機能がある場合は、抽象クラスを使用します。たとえば、基本抽象クラスのすべてのサブクラスに持たせたい一連の関数があるとします。

動作/機能に関する一般的な契約が必要な場合は、インターフェースを使用してください。さまざまなオブジェクトのセットを取りたい関数またはオブジェクトがある場合は、インターフェイスを使用します。次に、それを取得しているメソッドまたはオブジェクトを変更せずに、渡されたオブジェクトを変更できます。

インターフェースは、Abstract クラスと比較して、一般的に緩いです。インターフェイスのすべてのメソッドに対して常に同じコードを記述している状況では、インターフェイスを使用したくないでしょう。抽象クラスを使用して、各メソッドを 1 回定義します。

また、特定のオブジェクト継承階層を作成しようとしている場合、インターフェースだけでそれをしようとは思わないでしょう。

また、一部の言語では基本クラスを 1 つしか持てず、オブジェクトに既に基本クラスがある場合は、抽象基本クラスを使用するために何らかのリファクタリングを行う必要があります。これは、代わりにインターフェイスを使用したいという意味かもしれませんし、そうでないかもしれません。

@tvanfossonが指摘しているように、多くのインターフェースを使用することは悪い考えではありません。抽象クラスとインターフェースを本当に理解している場合、実際にはどちらかまたは両方の状況ではありません。特定の状況では、抽象クラスとインターフェースの両方を使用することも、どちらも使用しないこともできます。メソッドまたはオブジェクトが渡されたパラメーター オブジェクトでアクセスできるものを制限するために、単にインターフェイスを使用するのが好きな場合があります。

于 2009-02-17T18:34:35.737 に答える
4

抽象クラスは、特定のメソッドを実装する可能性を提供し、継承クラスで他のメソッドを実装する必要があります。インターフェイスでは、実装クラスですべてを実装する必要があります。

于 2009-02-17T18:41:09.213 に答える
2

@m4bwav が指摘しているように、主な違いは、抽象クラスが少なくともいくつかのメソッドにデフォルトの実装を提供できることです。これにより、抽象クラス自体の抽象クラスから継承するすべてのクラスに共通のコードを維持することにより、抽象クラスを使用してコードを DRY に保つことができます (同じことを繰り返さないでください)。

しかし、それは誤ったジレンマだと思います。インターフェイスと抽象クラスのどちらかを選択する必要はありませんし、間違いなくそうすべきではありません。ほとんどの場合、インターフェイスを定義してから、抽象クラスにデフォルトのスケルトン実装が必要/望ましい場合に提供させます。私にとっての問題は、インターフェイスまたは抽象クラスではなく、インターフェイスまたはインターフェイスと抽象クラスが必要かということです。インターフェースを使用すると、抽象クラスの実装であっても、コードを特定の実装から切り離すことができます。別の実装を選択する必要がある場合は、インターフェイスを使用するとこれが可能になりますが、抽象クラスしかない場合は、後でインターフェイスを追加するためにリファクタリングする必要があります。

このような状況でインターフェイスを提供することが望ましくないことがわかる唯一の状況は、実装のみを使用できるように制限したい場合です。抽象クラスを使用し、特定のメソッドを仮想にしないようにすると、実装者がクラスから派生しているすべての状況でコードの使用が強制されます。

于 2009-02-17T18:56:52.250 に答える