2017-12-22 12 views
3

私は電気装置を表すクラスを持っています(クラス1と呼んでいます)。また、複数のデバイスを表すクラスもあります。本質的には、一緒に結合されたデバイスの配列(クラス2)です。継承と集約の両方で2つのオブジェクトを関連付けることは、プログラミングの習慣としては悪いですか?

明らかに、クラス1のインスタンスがクラス2に含まれているという集約関係を持つのは理にかなっています。しかし、私の使用法では、クラス2をクラス1の大きなインスタンスとして考えるのが一般的です電池のバンクは単一の電池と考えることもできる)。

これは、私はまた、いくつかの追加のものを追加しているときに、クラス2、クラス1のメソッドと属性のすべてを再利用することを意味します。私の考えでは、これは継承関係も意味をなさないことを意味しますが、属性の一部は、ユーザが定義するのではなく、埋め込み親オブジェクトから派生するものです。

よくあることですか?私はプログラミングが新しくなっていますが、親クラスと子クラスの間に2つの別々の行があるUML図は見ていません。私のアプローチはプログラミングの練習が悪いのですか?そのような関係をよりよく表現していますか?

+0

可能であれば、継承よりも集計を優先します。この場合、class2を落としてclass1を内部で使用することができます。ちょうど木のように。私は集約と同時に相続の必要性を持っていませんでした。 –

答えて

4

私は右のあなたを理解していれば、あなたが記述パターンが「複合」と呼ばれるパターンのように聞こえる - 珍しいことではありませんもそれは悪い習慣have a look hereです。あなたが正しいです一般的に

、(継承はその点では本当に強いです)できるだけ低いクラス間の結合を維持しようとします。しかし、それが理にかなって、あなたのコードの理解がそれをそのように実装するならば。パターンや手法については実用的である。継承が理にかなって、クラス間の関係を真にモデル化したら、それを使用してください。

0

私はクラス1とクラス2の間の任意の継承がないと信じています。私がclass2でclass1メソッドを使用したいという理由は、継承を使用するのに十分ではありません。 Class1メソッドは、Class1のインスタンスによってClass2にのみ使用できます。集約だけです。

私たちは一つのクラス内の文字列の配列を使用する場合たとえば、私たちは、文字列を継承しません。別の例としては(本物の世界から)、本は紙のようなものではなく、マンションは一種の部屋ではありません。人のグループは人のようなものではありません。私は追加したい

1

唯一のことは、原理的には互いに複数の関係を有する2種類と間違って何もない、それはすべてあなたの仕様に依存していることです。あなたのケースでは、それは単にクラス2がクラス1の一種であり、クラス2がクラス1を集約していることを意味します。つまり、クラス1のクラスで、クラス1をさらに集約できます。したがって、これは、2つのクラス間の集約と一般化の両方を使用して表すことができます。しかし、私はあなたのケースでは、クラス2が本当にクラス1ではなく、コードを再利用するために継承を使用していることを確認しています。クラスを複合コンポーネントにさらに分割して再利用を促進することを検討することをお勧めします。あなたは、クラス2がポリモーフィックに扱われるように実装するクラス1の共通の特性を定義するためのインタフェースを考えることができます。

関連する問題