设为首页 加入收藏

TOP

Effective C++:条款38:通过复合塑模出has-a或“根据某物实现出”
2015-07-24 05:42:45 来源: 作者: 【 】 浏览:4
Tags:Effective 条款 通过 复合 has-a 根据 某物 现出

(一)

public继承是“is-a“的关系,而复合有”has-a“或”根据某物实现出(is-implemented-in-terms-of)“的意思――当复合发生在应用域内的对象之间,表现出has-a关系;当它发生于实现域内则是表示“根据某物实现出”的关系。

应用域部分,相当于你塑造的世界中的某些事物,例如人,汽车等。

后者的对象则是实现细节人工产品(这产品现实世界中是没有的),像什么mutex,list,container等等。这些对象是你的软件的实现领域。

复合:

class Address{...};
class PhoneNumber{...};
class Person{
      ...
private:
      std::string name_;
      Address address_;
      PhoneNumber voiceNumber_;
      PhoneNumber faxNumber_;
};

(二)

实例:set的构造。标准程序库中有set模板,它“每个元素都耗用三个指针”,是用平衡查找树实现而成,使它们在查找、插入、删除元素时保证拥有log(n)的效率。

可能会想到像这样实现:

让set继承stl::list:

template
  
    
class Set : public list
   
    {...}; //将list应用于set。错误做法。
   
  
这种做法是错误的!因为:public继承是is-a关系,父类能做的,子类也一定能做。但set不是一种list,因为对list为真的某些事情对set对象并不为真。例如,list可以内含重复元素,如果30被安插到list 两次,那个list将内含两个30,如果30被安插到set 两次,set只内含一个30.
所以这两个classes之间并非is-a关系。不应该是public继承,正确的做法是,set对象可根据一个list对象实现出来:

template 
    
     
class Set {
public:
	bool member(const T& item) const;
	void insert(const T& item);
	void remove(const T& item);
	size_t size() const;
private:
	list
     
       rep; }; template 
      
        bool Set
       
        ::member(const T& item) const { return find(rep.begin(), rep.end(), item) != rep.end(); } template 
        
          void Set
         
          ::insert(const T& item) { if(!member(item)) rep.push_back(item); } template 
          
            void Set
           
            ::remove(const T& item) { typename list
            
             ::iterator it = find(rep.begin(), rep.end(), item); if(it != rep.end()) rep.erase(it); } template 
             
               size_t Set
              
               ::size() const { return rep.size(); } 
              
             
            
           
          
         
        
       
      
     
    


请记住:

(1)复合的意义和public继承完全不同。

(2)在应用域,复合意味着has-a(有一个)。在实现域,复合意味着is-implemented-in-terms-of(根据某物实现出)。









】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU4089-Activation(概率DP) 下一篇POJ-3131-Cubic Eight-Puzzle(双..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: