2011-02-17 18 views
4

ANY java abstractはすべてObjectの抽象サブクラスです。時々、サブクラスにいくつかのメソッドを実装させる必要があるかもしれませんが、具象クラスを持つかなりよく定義された階層をすでに持っているかもしれません。例えば具体的なクラスの抽象サブクラスが悪い設計をしているのはなぜですか?

:私は車

--- 車<とよく機能して階層構造を持っており、今、私はこの階層にElectricCarを追加したいです。

車両< - カー< - 電気自動車。

私も電気自動車のすべての異なる種類がgetBatteryLifeなど特定の動作を実装したいsomething-

なぜそれがElectricCarの要約を作るために悪い考えでしょうか?

+9

誰が悪いデザインだと言っていますか? – SLaks

答えて

2

抽象化には何も問題ありません。ビジネスを抽象化する必要がある場合は問題ありません。あなたが言ったように、Javaのlibの多くのクラスは抽象的で、依然としてObjectを拡張しています。

1

それはそれほど悪いことではありません。一般的ではないが、悪くない。私が考えることができるのは分かりやすいことです:インスタンス化できる具体的なクラスのCarを見た場合、コードの99%がこの方法で動作するため、通常はその子もインスタンス化できると仮定します。電気自動車を具体化することができないということについて、もう一度言います。

0

個人的には、ElectricCar用のインターフェースを定義し、実装クラスがメソッドを定義できるようにしたいと思います。次に、別のメカニズムを使ってgetBatteryLifeの動作を共有できます。

私は継承のかなり深い階層構造を構築しました。私はそれらが時間の経過とともに蓄積する傾向がある脆弱な性質を避ける傾向があります。 1つの基本クラスは意味をなさないかもしれませんが、可能であれば、継承のない継承を共有するようにオブジェクトモデルを構成する方法について考えています。

+0

私はこれに同意しますか。 ElectronicCarは論理的にCarとIElectricCarの両方になりますが、IElectricCarはCarから派生することができないため、IElectricCarが実装者を必要としない限り、IElectricCarの実装者をCarとIElectricCarの両方として同時に使用することはできません。カーと同じメソッドを持っています(具体的な親の抽象的な派生型よりも感受性とデザインの原則に違反します)。 – KeithS

+0

私はトルコの表記法を使用していないので、特定のタイプの車が電気自動車の行動を望む場合に実装できるインタフェースElectricCar(IElectricCar)を定義することを意味しました。私はElectricCarの実装がないことを指していましたが、インタフェースとしてしか持たず、特定のCarタイプがその動作を望むなら実装することを可能にしました。 –

1

抽象宣言されている場合は "Car"が期待されるどこにでも "ElectricCar"を渡すことができないので、このパターンはLiskov Substituion Principleを破ると主張することができます(もちろんElectricCarサブクラスのインスタンスを渡すこともできます)。

具体的な電気自動車(水素電源/プラグイン/ etc?)は、「is-a」関係を満たしているため、「Car」から直接継承することが期待され、 "車"。彼らが提供すべきいくつかの一般的な振る舞いと特性を記述したければ、ElectricCar インタフェースも実装する必要があります。

車から継承する能力があると思われます(それ以来、それは何ですか)は、電気自動車関連の方法の共通の実装/再利用を使用しています。この場合、多重継承の問題またはmixinsの必要性がありますが、いずれもJavaで直接サポートされていません。

具体的な階層の真ん中に抽象クラスを提供することは、これを回避する方法の1つかもしれませんが、それほど美しいものではありません。

+0

私はLiskov Substitution Principleがここでは壊れていないと思う - あなたは** Electric Carが必要なすべてのタイプのインスタンスを渡すことができます(少なくとも、Carは一般的に燃料特有のものではない)。 –

0

私は、おそらくCarクラスは抽象的な(またはインターフェイス)であると言います。しかし、ElectricCarが抽象であることには何も問題はありません。

関連する問題