効果的なC ++用語38:(「何かを達成するためによると、」持って遵守やで金型によって)、オブジェクト指向の継承

複合リレーションシップクラス

  • 複合体:特定のタイプのオブジェクト内のオブジェクトの他のタイプを含む手段の種類との関係であります
  • 化合物(組成物)他の同義語が存在する(埋め込まれた)ことを埋め込む、例えば、(成層化)を積層し、封じ込めの(イントロン)、凝集(重合)
  • 例えば:
class Address {};
class PhoneNumber {};

//此类为复合类型
class Person
{
public:
    //...
private:
    std::string name;
    Address address;
    PhoneNumber voiceNumber;
    PhoneNumber faxNumber;
};

第二に、複合体は、2つの意味があり

  • 句32では、我々は、()の意味で、「公共の継承」を導入しました
  • 複合体は、2つの意味が含まれています。
    • ①has-(A):通常、アプリケーションドメインで使用されます
    • ②is・実装・イン・用語-の(何かが示す実装):通常、ドメインを実装するために使用

三、センス「-ています」

  • 代表的なものはあり-:他の種類のタイプであり、
  • 例えば、コードは非常に記事の冒頭で、Personクラスは、タイプ住所、PhoneNumberのタイプを持っているので、Personクラスがあり-たの感覚を

四は、「実装されているイン用語-の」意義

  • 実装されたインterms- (の何かを実現するために応じて)の代表的なものである:別のタイプのいくつかのタイプを実装します
  • 例えば:
    • C ++ STLライブラリのセットと、底部が地図上に設定されている達成する赤黒木構造であり、コンテナをマッピングし、感を持っている「実装されるイン-の用語」それが赤黒木構造に従って実装されているために
    • 別の例は、C ++ STLライブラリスタックおよびスタックので、内部ベクトル、リストや達成するために他のコンテナ、あること、それは「-実装されているイン用語-の」た意義キューイングすることができますキュー・コンテナであり、

ケース・プレゼンテーション

  • 今は需要があります。
    • 我々提供セットSTLコンテナを使用する必要はありませんが、コンテナセットの独自の定義に
    • そして達成を容易にするために、我々は設定を達成するためのSTLリストコンテナ容器内のメソッドを使用したいです
  • 間違ったアプローチに続いて、間違った理由は以下のとおりです。
    • 要素の集合の要素は繰返さないながらリスト要素は、反復可能です
    • だから、関係に違反して、この継承システムは、aは
//直接继承于std::list,在内部直接调用list的方法来实现Set
template<typename T>
class Set :public std::list<T>
{
	//...
};
  • あなたは「中・用語・オブ・実装されている、」アプローチ取る場合は、正しい方法は、以下の方法を取ることです。
//“is-implemented-in-terms-of”手法
template<typename T>
class Set
{
public:
    bool member(const T& item)const;
    void insert(const T& item);
    void remove(const T& item);
    std::size_t size()const;
private:
    std::list<T> rep; //底层以std::list实现
};

template<typename T>
bool Set<T>::member(const T& item)const
{
    return std::find(rep.begin(), rep.end(), item);
}

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,参阅条款42
    typename std::list<T>::iterator it 
        = std::find(rep.begin(), rep.end(), item);
    if (it != rep.end())
        rep.erase(it);
}

template<typename T>
std::size_t Set<T>::size()const
{
    return rep.size();
}
  • 「-実装されているイン用語-の(何かを達成するために応じて)」それは理解することは容易であるので、上記のコードでは、我々はすべて、作業セットに完全にはstd ::リストの一番下にあります、それはどういう意味インクルード

V.の概要

  • コンプレックスや公共継承全く別の意味
  • アプリケーションドメインでは、複合体を意味する(a)の-ています。ドメインを達成するには、複合体が実装されるイン - の観点から(に応じて実装もの)を意味します
リリース1525元の記事 ウォンの賞賛1085 ビュー45万+

おすすめ

転載: blog.csdn.net/qq_41453285/article/details/104827423