アンチパターンこの階層的にクラスを追加している:は、私はこのようないくつかのクラスを持っていた
+---+ +---+
| L | ---uses---> | D |
+---+ +---+
| +---+
inherit ----<---- | V |
| +---+ +---+
+---<--- | C |
+---+
さんが言ってみましょう。クラスL
は抽象クラスであり、V
とC
はそれを継承しています。 L
はクラスD
の特性を持っています。 - RA
- - 私の悪い描画のため申し訳ありませんし、また英語 -
今、私は新しいクラスを追加する必要がありますクラスD
とクラスV
の性質を持つクラスRA
の性質を持っている必要があり、しかし、私はまた、取得する必要がありますクラスのオブジェクトのプロパティV
。私の心の中では、次のようなものです:
+---+ +---+ +----+
| L | --uses--> | D | <--uses-- | RA |
+---+ +---+ +----+
| +---+ |
inherit ----<----| V | --uses-->--+
| +---+ +---+
+---<---| C |
+---+
私は分かりません!しかし、それは私には、アンチ・パターンやソリッド原理のLSPのブレーカが好きなようです - しかし、私はそれを理解できません。
私の新しいダイアグラムはアンチパターンですか?またはこの状況を設計するより良い方法がありますか?
D
,V
,C
およびRA
のようなクラスがインスタンス化できることに注意してください。
そして、私は、クラスD
のプロパティの使用がクラスV
に階層的になったことを意味しました。
編集:私はRA
を使用しての代わりD
ことによってそれをオーバーライドする必要がV
でそうV
とC
にL
でD
プロパティを使用してstring
値を返され、今 - - IGFP
は、私はインターフェイスを使用することを想像してみて。 C#クラスで
は以下のとおりです。
public abstract class L : VOBase<L>, IGFP {
public virtual D D { get; protected set; }
public virtual string Name { get; protected set; }
public virtual string GFP => $"{D.GFP}/{Name}"; // Here I use D property that I think breaks LSP
}
public class C : L {
public C (D d, string name) {
D = d;
Name = name;
}
}
public class V : L {
public V (RA ra, string name) {
RA = ra;
Name = name;
D = ra.D;
}
public RA RA { get; private set; }
public override string GFP => $"{RA.GFP}/{Name}"; // Here I should override GFP to use RA instead of D
}
public class D : VOBase<D>, IGFP {
public D (U u, string name) {
U = u;
Name = name;
}
public U U { get; private set; }
public string Name { get; private set; }
public string GFP => $"{U.GFP}/{Name}";
}
public class RA : VOBase<RA>, IGFP {
public RA (D d, string name) {
D = d;
Name = name;
}
public D D { get; private set; }
public string Name { get; private set; }
public string GFP => $"{D.GFP}/{Name}";
}
あなたの答えはtnxです。あなたはアンチパターンがないということを意味していると思います。 –
私はそう言っています: "あなたの図はどんなアンチパターンも示していません" – weston
私はいくつかの単純化を行っていますが、コードはまだあなたに間違って見えますか? – weston