web-dev-qa-db-ja.com

Vehicleクラスへの継承の構成の適用

私は、VehicleCarなどのいくつかの派生クラスを持つ抽象MotorCycleクラスを持つ車のメンテナンスガレージプログラムを持っています。これらの派生車両はそれぞれ燃料ですまたは電気自動車。したがって、FuelCarElectricCarFuelMotorCycleElectricMotorCycleなどを使用する代わりに、コンポジションを使用して実装しようとしています。

今の問題は、それが電気自動車または燃料自動車であるかどうかを常にチェックし、それに応じてas cast(c ++からのreinterpret_castのようなもの)を実行する必要があるか、各as castを次のようにラップする必要があるということです。 try catch。コードが複雑になります。

別のオプションは、EnergySource空のクラスを削除し、各車両にFuelElectricの両方を保持し、ctorで1つだけを初期化するようにすることですが、電気部品もある燃料車を持っている(たとえその部品がnullであっても)。これは3つの中で最も単純なようですが。

最善のアプローチは何かについて何か提案はありますか?

これが私が現在持っているもののUML図です:

enter image description here

コード: http://Pastebin.com/Rt5HccHC

4
shinzou

@radarbobこれらのメンバーが指定されているので、選択しませんでした。

私の同情。


...ハイブリッドカーは許可されるべきではなく、無関係です。

OK。その場合、FuelElectricVehicleの両方のプロパティを含めない方がよいでしょう。 「間違ったメッセージを送信します。」


...インターフェースにプロパティを配置することがどのように役立つかわかりませんが、まだ正方形です。

StackExchangeユニバース全体で、interfaces(キーワードの種類)の過剰な使用方法を確認しています。それは、「実装ではなくインターフェースへのコード」のあふれんばかりの誤用と誤解だと思います。


...最後に、あなたは堅固な菱形en.wikipedia.org/wiki/Class_diagram#Relationshipsを意味します

MLのジェシカシンプソン


...他に追加したいことはありますか?

はい。

VehicleVehicleEnergyクラスにラップする

示されている設計を前提として、Vehicleインスタンスを適切なラッパーメソッドまたはプロパティを使用してVehicleEnergyクラスに渡し、vehicle-EnergySourceの種類を照会します。しかし、どこかで、どういうわけかオブジェクトに問い合わせる必要があるという事実を回避する方法がわかりません。

これは、懸念の妥協がうまく分かれているように感じます。このスレッドへのコメントの急増は、矛盾する懸念の結果であるのではないかと思います。

このハイブリッドデザイン(しゃれた意図)は個別の側面を表現し、その後、一貫性のあるインターフェース(非キーワードの種類)でそれらの相互作用を表現すると思います。

Vehicleオブジェクトは常にそのまま使用することも、いわばそれ自体を偽装することもできます。

ああ、はい...ファクトリーパターンを使用して、必要な車両エネルギーにenumを渡すことができます。ハイブリッド車の列挙型メンバーはないため、これは「ハイブリッド」が定義されていないことを伝える強く型付けされた方法になります。

2
radarbob

自動車は、それが燃焼であろうと電気であろうと、EngineFuelを持っています。これらはあなたのabstract基本クラスです。次に、車はaEngineであり、そのエンジンがCombustionEngineであるかElectricEngineであるかは問題ではありません。

4
RubberDuck