私は、Vehicle
Car
などのいくつかの派生クラスを持つ抽象MotorCycle
クラスを持つ車のメンテナンスガレージプログラムを持っています。これらの派生車両はそれぞれ燃料ですまたは電気自動車。したがって、FuelCar
、ElectricCar
、FuelMotorCycle
、ElectricMotorCycle
などを使用する代わりに、コンポジションを使用して実装しようとしています。
今の問題は、それが電気自動車または燃料自動車であるかどうかを常にチェックし、それに応じてas cast
(c ++からのreinterpret_castのようなもの)を実行する必要があるか、各as cast
を次のようにラップする必要があるということです。 try catch
。コードが複雑になります。
別のオプションは、EnergySource
空のクラスを削除し、各車両にFuel
とElectric
の両方を保持し、ctorで1つだけを初期化するようにすることですが、電気部品もある燃料車を持っている(たとえその部品がnullであっても)。これは3つの中で最も単純なようですが。
最善のアプローチは何かについて何か提案はありますか?
これが私が現在持っているもののUML図です:
@radarbobこれらのメンバーが指定されているので、選択しませんでした。
私の同情。
...ハイブリッドカーは許可されるべきではなく、無関係です。
OK。その場合、Fuel
にElectric
とVehicle
の両方のプロパティを含めない方がよいでしょう。 「間違ったメッセージを送信します。」
...インターフェースにプロパティを配置することがどのように役立つかわかりませんが、まだ正方形です。
StackExchangeユニバース全体で、interface
s(キーワードの種類)の過剰な使用方法を確認しています。それは、「実装ではなくインターフェースへのコード」のあふれんばかりの誤用と誤解だと思います。
...最後に、あなたは堅固な菱形en.wikipedia.org/wiki/Class_diagram#Relationshipsを意味します
...他に追加したいことはありますか?
はい。
Vehicle
をVehicleEnergy
クラスにラップする
示されている設計を前提として、Vehicle
インスタンスを適切なラッパーメソッドまたはプロパティを使用してVehicleEnergy
クラスに渡し、vehicle-EnergySourceの種類を照会します。しかし、どこかで、どういうわけかオブジェクトに問い合わせる必要があるという事実を回避する方法がわかりません。
これは、懸念の妥協がうまく分かれているように感じます。このスレッドへのコメントの急増は、矛盾する懸念の結果であるのではないかと思います。
このハイブリッドデザイン(しゃれた意図)は個別の側面を表現し、その後、一貫性のあるインターフェース(非キーワードの種類)でそれらの相互作用を表現すると思います。
Vehicle
オブジェクトは常にそのまま使用することも、いわばそれ自体を偽装することもできます。
ああ、はい...ファクトリーパターンを使用して、必要な車両エネルギーにenum
を渡すことができます。ハイブリッド車の列挙型メンバーはないため、これは「ハイブリッド」が定義されていないことを伝える強く型付けされた方法になります。
自動車は、それが燃焼であろうと電気であろうと、Engine
とFuel
を持っています。これらはあなたのabstract
基本クラスです。次に、車はaEngine
であり、そのエンジンがCombustionEngine
であるかElectricEngine
であるかは問題ではありません。