2012-08-07 62 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; 
} 
相关问题