我有一些这样的课程:
+---+ +---+
| L | ---uses---> | D |
+---+ +---+
| +---+
inherit ----<---- | V |
| +---+ +---+
+---<--- | C |
+---+
让我们说; class L
是一个抽象类,V
和C
继承自该类。并且L
具有类D
的属性。 - 抱歉我的糟糕画和英语 -
现在,我需要添加一个新类 - RA
- 具有类D
的属性,而类V
应该具有类RA
的属性,但是我还需要从类L
所以V
的对象获取属性。在我看来是这样的:
+---+ +---+ +----+
| L | --uses--> | D | <--uses-- | RA |
+---+ +---+ +----+
| +---+ |
inherit ----<----| V | --uses-->--+
| +---+ +---+
+---<---| C |
+---+
我不确定!但在我看来,就像一个反模式或破坏LSP-SOLID原则 - 不知何故!但我无法弄明白。
我的新图表是反模式吗?还是有更好的方法来设计这种情况?
请注意,D
,V
,C
和RA
等类可以实例化。
我的意思是类D
的属性的使用现在在类V
中是分层次的。
修改
想象一下,我使用了一个界面 - IGFP
- 使用string
中的D
属性返回L
值,因此在V
和C
中,现在在V
我需要使用RA
代替D
来覆盖它
在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}";
}
答案 0 :(得分:2)
我确信无论你有什么味道,这个问题都没有真正描述过。
但是让我尝试将其分解。
第一个D
仅由其他两个类使用。没有错。是什么让D
引用类String
这两个类的不同?所以让我们从图中删除它:
+---+ +----+
| L | | RA |
+---+ +----+
| +---+ |
inherit ----<----| V | --uses-->--+
| +---+ +---+
+---<---| C |
+---+
现在,仅使用RA
,为什么与使用String
或D
等类有任何不同,让我们从图中删除它:
+---+
| L |
+---+
| +---+
inherit ----<----| V |
| +---+ +---+
+---<---| C |
+---+
所以现在我们有一个非常简单的图表,没有证明任何问题。
所以,不,你的图表没有表明任何反模式。但这并不是说它不是一个,只是图表中没有足够的信息。我知道你试图用英语解释,但英语含糊不清。只看到这些类如何交互的实际代码示例将允许人们识别反模式或改进。