zoukankan      html  css  js  c++  java
  • Effective C++:条款38:通过一个复杂的模具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<typename T> 
    class Set : public list<T>{...};   //将list应用于set。错误做法。
    这样的做法是错误的!由于:public继承是is-a关系,父类能做的,子类也一定能做。但set不是一种list,由于对list为真的某些事情对set对象并不为真。

    比如,list能够内含反复元素,假设30被安插到list<int>两次,那个list将内含两个30。假设30被安插到set<int>两次,set仅仅内含一个30.
    所以这两个classes之间并不是is-a关系。不应该是public继承,正确的做法是,set对象可依据一个list对象实现出来:

    template <typename T>
    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<T> rep;
    };
    
    template <typename T>
    bool Set<T>::member(const T& item) const {
    	return find(rep.begin(), rep.end(), item) != rep.end();
    }
    
    template <typename T>
    void Set<T>::insert(const T& item) {
    	if(!member(item)) rep.push_back(item);
    }
    
    template <typename T>
    void Set<T>::remove(const T& item) {
    	typename list<T>::iterator it = find(rep.begin(), rep.end(), item);
    	if(it != rep.end()) rep.erase(it);
    }
    
    template <typename T>
    size_t Set<T>::size() const {
    	return rep.size();
    }
    


    请记住:

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

    (2)在应用域,复合意味着has-a(有一个)。

    在实现域,复合意味着is-implemented-in-terms-of(依据某物实现出)。









    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    xp安装IIS admexs.dll问题
    MySql 牛哥推荐有空看看
    PHP常用类型判断函数
    GET和POST的真正区别
    许多真理
    PHP file_put_contents() 函数
    Intellijidea建javaWeb以及Servlet简单实现
    新手上路,配置阿里云CentOS服务器LAMP
    php的socket通信
    PHP常用的一些数组操作总结
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4908881.html
Copyright © 2011-2022 走看看