aggregation

aggregation فرایندی است که طی آن یک کلاس به عنوان یک عضو به کلاس دیگر اضافه می شود. به عنوان مثال کلاس Person می تواند یک فیلد از نوع کلاس Name داشته باشد. به کد زیر توجه کنید :

   1: package myfirstprogram;
   2: 
   3: class Name
   4: {
   5:     public String FirstName;
   6:     public String LastName;
   7: 
   8:     public Name(String f, String l)
   9:     {
  10:         this.FirstName = f;
  11:         this.LastName = l;
  12:     }
  13: }
  14: 
  15: class Person
  16: {
  17:     private Name myName;
  18: 
  19:     public Person(Name name)                             
  20:     {                                                    
  21:         myName = new Name(name.FirstName, name.LastName);
  22:     }                                                    
  23: 
  24:     @Override
  25:     public String toString()
  26:     {
  27:         return myName.FirstName + " " + myName.LastName;
  28:     }
  29: }
  30: 
  31: public class MyFirstProgram
  32: {
  33:     public static void main(String[] args)
  34:     {
  35:         Person person1 = new Person(new Name("John", "Smith"));
  36: 
  37:         System.out.println(person1.toString());
  38:     }
  39: }
John Smith

حال برنامه را به صورت بخش بخش توضیح می دهیم :

class Name
{
    public String FirstName;
    public String LastName;

    public Name(String f, String l)
    {
        this.FirstName = f;
        this.LastName = l;
    }
}

یک کلاس که قرار است به عنوان یک فیلد در کلاس دیگر به کار رود را تعریف می کنیم (خطوط 13-3). این کلاس دارای یک سازنده است که نام (f) و نام خانوادگی (l) را از شخص دریافت می کند. سپس این مقادیر را در خصوصیت های متناظر با آنها قرار می دهیم(خطوط 12-8).

class Person
{
    private Name myName;

    public Person(Name name)
    {
        myName = new Name(name.FirstName, name.LastName);
    }

    @Override
    public String toString()
    {
        return myName.FirstName + " " + myName.LastName;
    }
}

این کلاس شامل یک فیلد از نوع Name و خاصیت متناضر با آن است. این خصوصیت مقدار نام هر شی Person را در خود نگهداری می کند. به این نکته توجه کنید که سازنده یک شیء Name را می پذیرد و سپس با استفاده از این شیء فیلد myName را مقداردهی می کند. به این فرایند ترکیب (aggregation) می گویند.
همچنین در کلاس Person متد ()toString از کلاس Object را بازنویسی (override) می کنیم به طوری که در هنگام فراخوانی نام کامل شخص را نمایش دهد.

public class MyFirstProgram
{
    public static void main(String[] args)
    {
        Person person1 = new Person(new Name("John", "Smith"));

        System.out.println(person1.toString());
    }
}

در بالا یک شی Person را ایجاد و از سازنده ای که یک شی از نوع کلاس Name به عنوان آرگومان قبول می کند استفاده کرده ایم. این شی را مستقیما در داخل پرانتز ها تعریف و همچنین مقادیر خصوصیات firstname و lastname را به آن ارسال کرده ایم. در نهایت ، با استفاده از متد سفارشی ()toString نتیجه را چاپ می کنیم. به این نکته توجه کنید که کلاس ها می توانند شی هایی از نوع خود کلاس داشته باشند. به عنوان نمونه کلاس Person می تواند یک عضو با نوع Person داشته باشد. به کد زیر توجه نمایید :

class Person
{
   public Person Sibling;
   public String Name;
}

مشاهده می کنید که چگونه خصوصیتی از نوع Person در داخل کلاس Person تعریف شده است. پس هنگامی که یک شی Person تعریف می کنید ، شی ایجاد شده یک شی از نوع Person در داخل خود دارد.

Person person1 = new Person();
person1.Sibling = new Person();
person1.Name = "John Smith";
person1.Sibling.Name = "Mike Smith";

کد بالا چگونگی دسترسی و مقدار دهی به عضو (Sibling)Person را نشان داده است. از آنجایی که خصوصیت Sibling از نوع Person است پس می تواند یک شی Person در داخل خود داشته باشد. بنابراین می توان هر تعداد sibling که می خواهید در داخل شی person1 داشته باشید :

person1.Sibling.Sibling = new Person();
person1.Sibling.Sibling.Name = "Franc Smith";
person1.Sibling.Sibling.Sibling = new Person();
person1.Sibling.Sibling.Sibling.Name = "Bob Smith";
//And so on...