条項38:has-aまたはis-implemented-in-terms-ofを集約して設計する

3721 ワード

≪集約|Aggregate|emdw≫:タイプ間の関係です.タイプ内に別のタイプの変数が含まれていることです.
has-a:
 1 class Address

 2 {

 3     

 4 };

 5 

 6 class PhoneNumber

 7 {

 8     

 9 };

10 

11 class Person

12 {

13 public:

14     

15 private:

16     std::string name; 17  Address address; 18  PhoneNumber cellphone; 19 };

説明:Personには名前、住所、携帯電話番号が含まれており、典型的なhas-a関係である.
 
is-implemented-in-terms-of(あるタイプに応じて別のタイプを実現):
チェーンリストで集合Setを実装する[具体的にどのように実装するかは『アルゴリズムの精解:C言語記述7章』を参照してください]が、リストに重複する要素が含まれていてsetが重複できないことを知っているので、setはリストではなく、public継承によって要求を満たすことができない.もちろんsetを再設計することもできますが、setのほとんどの操作はListと同様であるため、ソフトウェア再利用の考え方に基づいて、setは以下のように定義できます.
 1 template<typename T>

 2 class Set

 3 {

 4 public:

 5     bool member(const T& item) const;

 6     void insert(const T& item);

 7     void remove(const T& item);

 8     std::size_t size() const;

 9     

10 private:

11     std::list<T> rep;

12 };

 
まとめ:
has-aは、1つのタイプが別のタイプの補完であることを意味する.is-implemented-in-terms-ofは、あるタイプが別のタイプで実現されることを意味する.