ترکیب (Composition)

در دنیای واقعی یک شی از بخش‌های مختلفی تشکیل شده است. برای مثال یک ماشین از بخش‌های مختلفی نظیر موتور، چرخ، در و … تشکیل شده است. به این نوع از رابطه بین بخش‌های مختلف یک شیء composition گفته می‌شود. همچنین آن را رابطه has-a نیز می‌نامند. Composition به ما اجازه می‌دهد تا برای هر وظیفه یک کلاس ایجاد کنیم. مزایای composition عبارتند از:

  • هر کلاس می‌تواند ساده و صریح باشد.
  • یک کلاس می‌تواند بر روی وظایف مشخصی تمرکز کند.
  • نوشتن، خطا یابی، درک و استفاده از کلاس‌ها ساده‌تر می‌شود.
  • باعث کاهش پیچیدگی شی می‌شود.
  • یک کلاس پیچیده می‌تواند در صورت لزوم کنترل برخی اعمال را به کلاس‌های کوچک‌تر منتقل کند.

برنامه زیر composition را نشان می‌دهد:

   1: #include<iostream>
   2: #include<string>
   3: using namespace std;
   4: 
   5: class Engine
   6: {
   7:   public:
   8:     int power;
   9: };
  10: 
  11: class Car
  12: {
  13:   public:
  14:     Engine engine;
  15:     string company;
  16:     string color;
  17:     void showDetails()
  18:     {
  19:       cout << "Compnay is: " << company << endl;
  20:       cout << "Color is: " << color << endl;
  21:       cout << "Engine horse power is: " << engine.power << endl;
  22:     }
  23: };
  24: 
  25: int main()
  26: {
  27:   Car car;
  28:   car.engine.power = 500;
  29:   car.company = "hyundai";
  30:   car.color = "black";
  31:   car.showDetails();
  32: }
Compnay is: hyundai
Color is: black
Engine horse power is: 500

همانطور که در کد بالا مشاهده می کنید ما یک کلاس به نام Engine تعریف کرده ایم (خطوط 9-5) که دارای یک فیلد به نام Power (خط 8) می باشد. حال همین کلاس را به عنوان یک فیلد از کلاس Car در خط 14 معرفی نموده ایم. در نتیجه برای استفاده از خاصیت Power باید به صورت تودرتو به آن دست یابیم (خط 28). نکته ای که در خط 28 وجود دارد این است که قبلا ذکر کردیم که برای دسترسی به فیلد های یک کلاس باید از علامت نقطه (.) استفاده کنیم. در نتیجه در این خط چون Power یک فیلد از کلاس Engine و Engine هم یک فیلد از کلاس Car است، به این صورت عمل کرده ایم.