web-dev-qa-db-ja.com

継承と構成の組み合わせ

ブリッジ/ワイヤレスリピーターとして機能するワイヤレスネットワークがあるとします。どちらもクラス図をどのように考慮しますか?私の頭の中では、単独で存在できる親オブジェクトを持つことには意味があります。次に、両方が親に依存しているが、親のインスタンスも作成する子オブジェクト。子は、継承されたすべての属性にアクセスでき、親インスタンスのメソッドと属性を使用するメソッドをオーバーロードできます。

Does this make any sense at all on what i'm trying to do? I'm trying to combine composition with inheritance and not sure if that's the "right way" to do it or since accessing the parent would be a method, only inheritance needs to be shown.

私の考えでは、ワイヤレスリピーターには親ワイヤレスネットワーク(集合)がありますが、ワイヤレスネットワーク属性を継承する完全に別のネットワークもあります。ブリッジネットワークはメインワイヤレスネットワークのプライベート拡張であり、これをシーケンス図で示すことができる必要があるため、私はその方向性を求めています。

1
Nels

設計では、WirelessNetworkは1つ以上のWirelessRepeaterを持つことができ、WirelessRepeater自体はWirelessNetworkです。ここではUMLの問題はありませんが、継承と構成をグラフィカルに区別できる場合(例:2つの平行線)は、ダイアグラムが読みやすくなります。

設計の結果は、WirelessRepeaterWirelessNetworkのすべての属性を持つことです。しかし、それ自体の価値があると、それは必ずしも所有ネットワークの価値に対応するわけではありません。さらに、リピーターはすべてのネットワークサービスを提供します。これには、リピーターに関連しないサービスも含まれます(たとえば、実際のリピーターの構成オプションは、ルーターの構成オプションに比べて非常に制限されています)。

したがって、モデルは正確ではありません。

  • まず、UMLセマンティクスによれば、親ネットワークが破壊されると、リピーターも破壊されるはずです。そのため、コンポジションを集約、または単純な関連付けで置き換えるほうが適切です。
  • 次に、リピーターはネットワークではありません。リピーターはネットワークに接続され、その範囲を拡張します。しかし、たとえば、それ自体のアドレス指定スキームは定義されていません。

IMHOは プロキシパターン を使用するほうがよいでしょう。リピーターはネットワークのプロキシであり、ネットワークとプロキシの両方が、利用可能なネットワークメソッドを定義するクラスから継承します。両方(例:connect())ですが、ネットワークにのみ関連するメソッド(例:setIPAdressingScheme())は含まれません。

3
Christophe

これは冗長です。継承すると、とにかく親を構築します。その親を自分で構成する場合は、親の2番目のインスタンスが作成されるだけです。

継承により、親のインスタンス、それらのインターフェース、およびそれらの間の配線が無料で提供されます。

構成(および委任)はすべて同じものを提供しますが、すべてを配線する必要があるため、追加のキーストロークがかかります。しかし、ここには多くのパワーと柔軟性があります。

特別な理由なしに両方を同時に実行しても、混乱しているメンテナンス開発者以外に多くのことは得られません。

0
candied_orange