2016-02-28 36 views
0

試圖設計一個系統,其中一個類將在項目中定義,在另一箇中引用並在後者中具有新功能。有這樣的模式嗎?客戶端添加的行爲

背景:我有一個遊戲在一個共同的項目中有項目。服務器和客戶端都引用這個相同的項目,所以我可以在服務器和客戶端都有這個項目,這樣就更容易在兩者之間進行序列化和反序列化。問題是,我無法重新定義客戶端中的StaffItem類,因爲它會改變服務器對此類的視角。我試圖找到一種很好的方法來將例如渲染添加到類的客戶端視圖(添加了紋理和所有代碼)。

我幾乎要放棄了,只需將渲染代碼放在公共項目中,然後將其存入服務器。任何指針(赫赫)將不勝感激。

+0

爲了理解這個問題,爲什麼要在從'StaffItem'類繼承的客戶端上創建一個子類不起作用? –

+0

「的問題是,我無法重新定義客戶端中的StaffItem類」Redifine怎麼樣?爲什麼? –

+0

嗯@iuliu.net我想保持相同的類,因爲我會用我的序列化。我將爲這些類型分配ID。我想我可以使用一個子類,並改變我的序列化工作方式... –

回答

0

如果我理解你的問題,你可以考慮兩種選擇。第一種是使用帶有裝飾圖案水木清華相似:

class StaffItem : IStaffItem { 
    public int MyProp {get;set;} 
    public void MyAction() {} 
} 
class ClientStaffItem : IStaffItem { 
    private StaffItem _staffItem; 
    public ClientStaffItem(StaffItem staffItem) { 
    _staffItem = staffItem; 
    } 
    public int MyProp { 
     get { return _staffItem.MyProp;} 
     set {_staffItem.MyProp; = value;} 
    } 
    public void MyAction() { 
    _staffItem.MyAction(); 
    } 
    public void YouClientMethod() {} 
} 

另一種使用繼承,但確定需要哪些字段序列化,以及如何和使用屬性或自定義序列化設置,以紀念只需要屬性。

1

您可以引入一個DTO類用於序列化和反序列化,而不是通過網絡傳輸實際對象。這解耦了雙方的實際實現。

+0

+1,但展開答案。解釋爲什麼不依賴業務領域中的通信協議/對象是個好主意。請解釋爲什麼強耦合使得以後難以提高代碼質量。 – jgauffin