對象關係分析(非繼承關係)

來源:互聯網
上載者:User

標籤:des   each   鍵盤   end   and   個人   return   使用   變數   

  現實環境存在各種對象關係,可以使用特殊的關聯類型描述詞來形容這些關係。

例如:

  1. 方形是屬於形狀的一種,可以用“is-a”來描述方形與形狀的關係。  

  2. 汽車都有方向盤,可以用“has-a”來描述汽車與方向盤的關係。

  3. 程式員使用鍵盤編輯代碼,可以用“uses-a”來描述程式員與鍵盤的關係。

  4. 花朵依賴蜜蜂傳播花粉,可以使用“depends-on”來描述花朵與蜜蜂的關係。

  5. 學生是一個班級的成員,可以使用“member-of”來描述學生與班級的關係。

  6. 肢體屬於人體的一部分,可以使用“part-of”來描述肢體與人體的關係。

  使用C++進行物件導向的編程過程,如果能精準的理解對象間的關係,對編寫高品質的代碼有很大協助。

  下面列出幾個典型的對象關係(非繼承):

  一. 對象組合關係

  對象組合關係易於理解,如一輛車是由車輪、車架、發動機等裝置群組成的,電腦是由顯示器,機箱,CPU等

裝置群組成的。這些關係稱為組合關係(composition),而在這種情況下,整車與輪子的關係為包含(“has-a”)。

在C++中,對象組合關係能夠將複雜的類轉化為多個簡單的類的組合,簡化了複雜類的操作。

  對象組合又包含兩種形式:一種是組合,另一種是彙總。

  1.  組合關係:

  滿足組合關係包含下面幾個前提:

  a. 成員必須是類的一部分;

  b. 成員在一個時期只能屬於一個類;

  c. 成員在一個類中必須存在;

  d. 成員不必知道自身包含在某個類中。

  組合的關係尤似人體與心臟的關係,部分必須包含於整體,整體必須由部分組成,某一時刻心臟

必須屬於某個人體,而不能屬於其他人體。組合關係強調對象的完整性必須由成員來保證,成員與對象是單向

保證的,即對象必須包含成員,而成員不一定存在於此對象。

  class Point2D

  {

    private:

      int m_x;

      int m_y;

      ...

    public:

      ...

  }

 其中m_x、m_y與類Point2D的關係即為組合關係。

  2. 彙總關係

  滿足彙總關係包含下面幾個要素:

  a. 成員必須是類的一部分;

  b. 成員在一個時期可以屬於多個類;

  c. 成員在類中不必一定存在;

  d. 成員不必知道自身包含在某個類中。

  同組合關係一樣,彙總關係也是部分與整體的關係,但不同於組合關係,成員可以在同一時期屬於多個對象,

當彙總關聯性物件建立或消滅時,彙總成員既不負責建立對象的組件,也不負責消除對象的組件。這好比人與家庭住址的

關係,每個人都有住址,然而這個住址可以屬於多個人(父母兄弟)。人員不管理住址,事實上在人住那之前,那個地址

可能就已經存在。此外,人通常知道自己住址名稱,但住址不知道誰住在該處。這裡人與住址的關係就是彙總關係。

  對彙總關係進行建模時,處理對象析構時,整體對象不負責銷毀彙總成員。     

  包含彙總關係的類實現同組合關係基本相同,因為它們都是屬於整體部分的關係。

  在組合關係中,成員變數通常是普通變數,如果是指標,則組合類別必須負責分配和釋放該指標指向的空間。

  在彙總關係中,成員變數通常是引用或者指標,並且該成員變數引用的是類範圍外的對象。因此,當對象被

銷毀時,其中彙總關係成員變數引用或指標將被銷毀,但是引用或指向的對象仍然存在。

  如下樣本,教師與教師名字是組合的關係,教師必須有名字,教師與名字共存,教師類對象銷毀後,教師名字也銷毀了。

而教師與部門的關係是彙總的關係,該部門可以有很多其他教師,教師也可以同時屬於別的部門,該部門銷毀後,教師仍然存在。

#include <string> class Teacher{private:    std::string m_name; public:    Teacher(std::string name)        : m_name(name)    {    }     std::string getName() { return m_name; }}; class Department{private:    Teacher *m_teacher; // This dept holds only one teacher for simplicity, but it could hold many teachers public:    Department(Teacher *teacher=NULL)        : m_teacher(teacher)    {    }}; int main(){    // Create a teacher outside the scope of the Department    Teacher *teacher = new Teacher("Bob"); // create a teacher    {        // Create a department and use the constructor parameter to pass        // the teacher to it.        Department dept(teacher);     } // dept goes out of scope here and is destroyed     // Teacher still exists here because dept did not delete m_teacher     std::cout << teacher->getName() << " still exists!";     delete teacher;     return 0;}

 

對象關係分析(非繼承關係)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.