web-dev-qa-db-ja.com

抽象クラスを使用する場合

ここに abstract classes に関するMSDN記事がありますが、実際にはわかりません...

いつ抽象クラスを本当に使用する必要がありますか?抽象クラスを使用する利点は何ですか?

77
bala3569

抽象クラスは、継承とポリモーフィズムの目的でクラスが必要な場合に役立ちますが、クラス自体をインスタンス化しても意味がなく、サブクラスのみがインスタンス化されます。一般的な実装コードを共有するサブクラスのグループにテンプレートを定義したい場合によく使用されますが、スーパークラスのオブジェクトを作成できないことを保証したい場合もあります。

たとえば、犬、猫、ハムスター、魚のオブジェクトを作成する必要があるとしましょう。これらは、色、サイズ、脚の数、動作などの類似のプロパティを持っているため、Animalスーパークラスを作成します。しかし、動物は何色ですか?動物オブジェクトには何本の足がありますか?この場合、Animal型のオブジェクトをインスタンス化するのはあまり意味がなく、サブクラスのみがインスタンス化されます。

抽象クラスには、ポリモーフィズムにおける追加の利点もあります。メソッド引数または戻り値の型として(抽象)スーパークラスの型を使用できます。たとえば、train()メソッドを持つPetOwnerクラスがある場合は、Animalタイプのオブジェクトを取り込むように定義できます。 Animalのすべてのサブタイプのメソッドを作成するのではなく、train(Animal a)。

136
richard

抽象クラスを使用することにより、クラスをより一般的にすることができます。

たとえば、クラスAが抽象クラスであり、抽象クラスAを拡張するクラスクラスB、クラスC、およびクラスDがある場合、これらのサブクラスは抽象クラスAですでに宣言されているメソッドを継承し、メソッドをより汎用的にします。

6
Vivek Saurabh

決して作成されないクラスにそれらを使用します(したがって、事実上存在しません)が、ポリモーフィズムの理由でそれらから継承したいです。

4
Puppy

オブジェクトを直接インスタンス化するために決して使用されないクラス階層内のクラスの動作を定義する場合は、抽象クラスを使用します。

ですから、自分自身をしばらくの間、神と考えてください。 CBabyBoyクラスとCBanyGirlクラスは抽象ではありません。これらは作成されるソリッドオブジェクトであるためです。一方、CPersonおよびCAnimalクラスは抽象的です-型階層の観点からは便利ですが、CAnimal Dingbat = new Animal();を実行することはありません

3
Martin Milan

リチャードは を提供しました。抽象クラスは非抽象クラスよりも利点があります。

抽象クラスとインターフェースを選択するためのファクトテーブルを追加したいと思います。画像は here にあります。

enter image description here

3
Anton Lyhin

基本的に、抽象クラスを使用する必要があります。階層内の一部のエンティティに、実装方法がわからないメソッドが論理的に含まれる場合、その子孫はそうです。ウェブ上には何十億もの「実生活」の例があります、本当に)

2
n535