ترکیب (Composition)
در قسمت وراثت خواندیم که گاهی اوقات بین دو یا چند کلاس یک رابطه Is-A برقرار است. مثلا:
اتومبیل یک وسیله نقلیه است.
موتورسیکلت یک وسیله نقلیه است.
وقتی رابطه Is-A بین دو کلاس برقرار باشد میتوانیم یک رابطه وراثتی بین آنها ایجاد کنیم.
اما رابطه دیگری وجود دارد به نام Has-A که میتوانیم آن را به دارد یک ترجمه کنیم. هرگاه رابطه Has-A بین دو کلاس وجود داشته باشد آنگاه میتوان ترکیب را در آن پیادهسازی کرد.
در جاوا ترکیب با استفاده از قرار دادن یک متغیر از جنس یک کلاس در کلاسی دیگر که با آن رابطه Has-A دارد حاصل میشود.
مثال: دو کلاس به نامهای Job و Person داریم. از آنجا که هر شخص (Person) یک شغل (Job) دارد پس میتوان ترکیب را در این دو کلاس پیادهسازی کرد.
کلاس Job به صورت زیر نوشته شده است:
public class Job { private double salary; public Job(double salary) { this.salary = salary; } public double getSalary() { return salary; } }
این کلاس نیازی به توضیح ندارد و همانطور که مشاهده میکنید فقط یک فیلد به نام salary (حقوق) در این کلاس وجود دارد که در سازنده کلاس مقداری به عنوان میزان حقوق شغل دریافت شده و به فیلد salary نسبت داده میشود.
کلاس Person به صورت زیر تعریف شده است:
public class Person { private String name; private Job job; public Person(String name, double jobSalary) { job = new Job(jobSalary); this.name = name; } public double getSalary() { return job.getSalary(); } }
همانطور که میبینید یک فیلد از نوع کلاس Job در این کلاس وجود دارد پس ما ترکیب را در کلاس Person پیادهسازی کردیم حال از این فیلد میتوان به شکلهای گوناگون استفاده کرد.
در سازنده این کلاس دو مقدار دریافت میشود که اولی نام شخص و دومی حقوق شخص است. مقدار name که به فیلد name نسبت داده شده است و مقدار jobSalary به سازنده کلاس Job داده شده است.
متد getSalary که در این کلاس تعریف شده از متد getSalary مربوط به شی job استفاده کرده و مقدار حقوق شخص را بر میگرداند.
البته این مثالی بسیار ساده برای نشان دادن بحث ترکیب است. واضح است که محدودیتی برای تعداد متغیرهایی مانند متغیر job نداریم و میتوانیم بنابر نیاز خود به هر شکلی از این متغیرها استفاده کنیم.
اگه برای هر قسمت چندتا تمرین هم بزارید خیلی خوب میشه.
شرح موضوعات بسیار روان و ساده توضیح داده شده.
بی نهایت ممنون از اینکه وقت گذاشتی و این مطالب رو به اشتراک می زاری.