さまざまなブランドの車をモデル化する場合、継承階層を使用しますか?それともコンストラクターのパラメーターを変更するだけですか?
継承を使用してオブジェクトを関連付けるか、単に同じクラスを再利用するかの一般的なルールは何ですか?
車の場合は、単に new Car("Porsche","991","3.8") のようなことを行うか、「Porsche」のような抽象サブクラスのメーカーと、場合によっては各モデルのクラスを持つ、全体的な抽象的な Car スーパークラスを持つことができます。ポルシェ?
すべての車 (またはオブジェクトに作用するメソッド) で共有されるいくつかのプロパティがあり、各メーカー/モデルに固有のプロパティ (またはメソッド) がある場合は、継承を使用する必要があります。それ以外の場合は、インスタンスを変更するだけで問題ありません。
すべての車にこれらのプロパティが必要だとしましょう:
この場合、何も購入しないため、クラス階層を作成したくないでしょう。
代わりに、レギュラーとレースカーの 2 つの「タイプ」の車があり、レースカーだけが亜酸化窒素を有効にできる場合 (おそらくこれを行うメソッド)、RegularCar と RaceCar を継承する Car クラスが必要になります。それから。
常に同じパラメーターをコンストラクターに渡さなければならないことが心配な場合は、代わりにコンストラクターを呼び出す静的メソッドを作成できます。これはFactory method patternとして知られています。
PS: 私の例は本当に私の頭のてっぺんから出てきたものです。しかし、私が言おうとしていることを理解していただければ幸いです:)
単一クラスのアプローチの問題は、さまざまな種類のすべてのCar
s に対して同じインスタンス変数とメソッドを使用しなければならないことです。
たとえば、オートボットには、transform()
他のほとんどの車にはない方法があります。
つまり、理論的には、transform()
すべてCar
の s に対してメソッドを定義し、それをサポートしていない車に例外をスローさせることができます。しかし、それは継承を使用するよりもはるかに厄介な設計です。
継承により、ポリモーフィズムなどの凝った処理も可能になります。たとえば、各車にはparallelPark()
メソッドがある場合があります。しかし、高級車には、他のすべての車とは異なる自動縦列駐車メカニズムが搭載されている場合があります。その場合、parallelPark()
メソッドをオーバーライドするだけで、Java が適切なメソッドを選択します。
それは、メーカーやモデルなどのプロパティに依存するロジックの量に依存すると思います。new Car("Porsche","991","3.8")
製造元とモデルは単なるプロパティであるため、なしの場合は を実行するのが理にかなっています。ただし、メーカーとモデルが他のプロパティまたはロジックの 1 つのセットを定義する場合、クラスは意味があるかもしれません。new Car("Porsche","991","3.8", gearingRatios, topSpeed, price, etc)
そうすれば、ポルシェ 991 が必要になるたびに渡す代わりにPorsche991
、これらすべてのプロパティを定義するクラスを定義するだけで済みます。
または、そのロジック部分をさらに拡張すると、 ifPorsche
とVolkswagen
car が、たとえばメソッドで非常に異なるロジックを持つ場合、拡張不可能な switch/case メソッドを使用するAccelerate()
代わりに、継承を使用できます。Accelerate()
または、Porsche
s がRace()
メソッドを必要とVolkswagen
しないのに s が必要な場合など。
Car
をどのように使用する予定かを知らずに、これを例に一般化することは困難ですCar
。
車のようなスーパークラスの場合、より適切なサブクラスはクーペ、セダン、およびコンバーチブルです。車のモデルはパラメーターである必要があります。
type object pattern (pdf)を見てください。