2

我有一些類是這樣的:是加入這個分層級的反模式

+---+    +---+ 
| L | ---uses---> | D | 
+---+    +---+ 
    |    +---+ 
inherit ----<---- | V | 
    |  +---+ +---+ 
    +---<--- | C | 
      +---+ 

假設;類L是一個抽象類,並且VC從它繼承。並且L有類D的財產。 - 對不起,我的壞繪畫和英語的也

現在,我需要添加一個新的類 - RA - 有D類和V類的屬性應該有RA類的屬性,但我也需要得到財產從類L因此V的對象。在我看來是這樣的:

+---+   +---+   +----+ 
| L | --uses--> | D | <--uses-- | RA | 
+---+   +---+   +----+ 
    |    +---+   | 
inherit ----<----| V | --uses-->--+ 
    |  +---+ +---+ 
    +---<---| C | 
      +---+ 

我不確定!但在我看來,像某種反固定模式或斷路器的固體原理 - 不知何故!但我無法弄清楚。

我的新圖是反模式嗎?還是有更好的方法來設計這種情況?

請注意,像D,V,CRA這樣的類可以實例化。
我的意思是類D的屬性的使用現在分級在V

編輯:
想象一下,我使用的接口 - IGFP - 通過使用D財產L所以在VC返回string值,現在在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}"; 
} 

回答

2

我敢肯定,無論你是聞是不是真的被這個問題所描述。

但讓我試圖分解它。第一個D只被其他兩個類使用。沒有錯。什麼使D與引用像String這樣的類的兩個類有什麼不同?因此,讓我們從圖表中刪除:

+---+       +----+ 
| L |       | RA | 
+---+       +----+ 
    |    +---+   | 
inherit ----<----| V | --uses-->--+ 
    |  +---+ +---+ 
    +---<---| C | 
      +---+ 

現在,RA只使用,這是爲什麼使用像StringD類有什麼不同,我們從圖中刪除:

+---+ 
| L | 
+---+ 
    |    +---+    
inherit ----<----| V | 
    |  +---+ +---+ 
    +---<---| C | 
      +---+ 

所以現在我們有一個非常簡單的圖表,沒有顯示任何問題。

所以,不,你的圖不表示任何反模式。但這並不是說它不是一個,只是圖表沒有包含足夠的信息。我知道你已經嘗試用英語解釋,但英語不明確。只有看到這些類如何交互的實際代碼示例才能讓人們識別反模式或改進。

+0

tnx爲你的答案,我認爲你的意思是沒有任何反模式,我會在這裏添加一些代碼以使其更有意義;)。 –

+0

我這樣說:「你的圖不表示任何反模式」 – weston

+0

我已經做了一些簡化,代碼仍然看起來錯了嗎? – weston