2012-08-07 50 views
4

問題比平時長,但我試圖闡述。請多多包涵和閱讀整個問題,它可能是一個有趣的問題派生一個類只是爲了識別類型的一個好主意嗎?

我有一個方法,當前接受具有兩個屬性List<X>但代表兩個不同的實體,因此財產被恰當地命名爲R和S對象的.class結構是

class A 
{ 
    List<X> R; 
    List<X> S; 
} 

,我現在有接受A型的輸入和與兩個工作的方法(集合,下面方法簽名)

public void updateMe(A objA) 
{ 

} 

現在我甲肝ea的情況下,我需要重用此方法,但現在的情況是,我不需要區分實體,因此有一個單一的列表,List<X>噸。

現在我的問題是我如何重構方法來處理一個單一列表,但仍然提供了在先前情況下區分這兩個列表的能力。

我的方法將更新這些集合,因此可以添加到列表中或從中刪除。

我現在的解決方案是創建新的類來表示從X派生出來的兩個不同的實體,然後將這個基類列表傳遞給我的方法,讓該方法更新這個基類,然後在閱讀它時我將能夠以確定哪個對象是什麼類型。

因此,我的新的班會

public class X1:X 
{ 
} 

public class X2:X 
{ 
} 



class A 
{ 
    List<X> R; 
} 

這是最好的解決辦法還是有,我可以拿這裏的任何其他辦法..我只是不似乎想擴展一個類的想法只是爲了識別不添加任何屬性類型..

+0

它是如何在一種情況下需要區分兩個列表而不關心其他情況? – casablanca 2012-08-08 02:57:04

+0

該方法的消費者在一種情況下呈現兩個列表單獨標識它們,而在另一種情況下它不會.. – user917670 2012-08-08 05:47:55

回答

0

我會說,無論是: 1.使用ENUM :) 2.製作類ý& Z到與抽象方法的GetList()延伸抽象X。但對於這個簡單的例子來說,這肯定是一種矯枉過正。所以,回到1 - 只是使用枚舉:)

+1

也許你應該提供一個代碼示例來闡明 – 2012-10-05 18:57:48

0

看來,目標是實現一種形式的多態性的類的內容。從這個意義上講,你應該爲內部內容隔離一個類,所以我的回答關注的是導致你的問題而不是質疑自己的目標。

一般來說,對於您的問題的先驗,我想說,兩個集合之間的區別,每個代表一個不同的實體,不是代表類型的問題,假設它是正確的,但責任呼叫者。
我的答案遵循此路徑,但是以強類型方式實現變量內部表示和更新邏輯,具有靜態多態性(由於時間原因,請省略,以解釋您的選擇)。

至於決定是否使用X一個子類的規則,你應該問自己:經營的List<X> RList<X> S更新updateMe邏輯,它會按對象X的細節?

我從你的問題中推測,這並不總是兩個列表,我的解決方案也概括了收集類型。
我希望能給你一個出發點。如果我猜你的要求,我會說明更多。

template <class staticPolimorphicAInnerT> 
class A 
{ 
    public: 
     void updatMe (const A& ref) { 
      // <do something pre if necessary> 
      updateInnerMe (A.innerObj); 
      // <do some other post if necessary> 
     } 

     void updateInnerMe (const staticPolimorphicAInnerT& innerRef) { 
      innerObj.updateMe (innerRef); 
      // or better: 
      // inner_update_method (innerRef) 
     } 

    private: 
     // is used to request the static polymorphism 
     typedef void (staticPolimorphicAInnerT::* inner_update_method) (const staticPolimorphicAInnerT&) 
     staticPolimorphicAInnerT innerObj; 
     //<something more i hope> 

} 

template <class T> 
class AInnerFirst 
{ 
    public: 
     void updatMe (const AInnerFirst& ref) { 
      // <do something with R> 
      // <do something with S> 
     } 

    private: 
     List<T> R; 
     List<T> S; 
} 

template <class T> 
class AInnerSecond 
{ 
    public: 
     void updatMe (const AInnerSecond& ref) { 
      // <do something with W> 
     } 

    private: 
     Vector<T> W; 
} 
相關問題