جلسه ۴۴: وراثت چندگانه در جاوا

در این درس خواهید آموخت که وراثت چندگانه چیست و چگونه می توان آن را در جاوا پیاده سازی کرد. موارد زیر را بیان خواهیم کرد:
- وراثت چندگانه چیست؟
- نحوه پیاده سازی
- یک مثال
- مقایسه اینترفیس با کلاس انتزاعی
وراثت چندگانه چیست؟
وقتی یک کلاس از بیش از یک کلاس پایه مشتق شده باشد ، به عبارت دیگر وقتی یک کلاس بیش از یک کلاس والد (والد مستقیم و بدون واسطه) دارد ، یک نمونه از وراثت چندگانه است. مثال:
- هیوندای النترا اتومبیل است
- یک هیوندای النترا یک سدان نیز است
نحوه پیاده سازی
همانطور که قبلاً ذکر شد ، در جاوا ، یک کلاس نمی تواند از بیش از یک کلاس ارث بری داشته باشد. بنابراین این سوال مطرح می شود ، “چگونه می توانیم وراثت چندگانه را پیاده سازی کنیم؟” پاسخ سوال فوق Interface
ها هستند. در جاوا وراثت چندگانه را می توان با استفاده از اینترفیس ها پیاده سازی کرد.
کلاس ها و اینترفیس ها می توانند از بیش از یک اینترفیس ارث بری داشته باشد.
بنابراین از این طریق می توان به وراثت چندگانه در جاوا دست یافت.
یک مثال
بیایید مثالی از الانترا را که در ابتدای درس آورده شده است ، پیاده کنیم. این مثال را می توان با استفاده از موارد زیر پیاده سازی کرد:
- یک کلاس پایه به نام
Car
- اینترفیسی به نام
IsSedan
- یک کلاس
Elantra
ازCar
مشتق شده وIsSedan
را پیاده سازی می کند
این رابطه ها را می توان در تصویر زیر دید:
پیاده سازی را در زیر می بینید:
class Car { // Base class
private int model; // Common features of all cars
private String manufacturer;
public Car(int model, String manufacturer) { // Constructor
this.model = model;
this.manufacturer = manufacturer;
}
public void printDetails() {
System.out.println("The model of " + getClass().getSimpleName() + " is: " + model);
System.out.println("The manufacturer of " + getClass().getSimpleName() + " is: " + manufacturer);
}
} // End of Car class
interface IsSedan { // Interface for sedans
int bootSpace = 420; // Sedans have boot space
void bootSpace(); // Every sedan must implement this
} // End of IsSedan interface
class Elantra extends Car implements IsSedan { // Elantra is a Car and is a Sedan also
private String variant; // Elantra's data member
public Elantra(int model, String variant) { // Constructor
super(model, "Hyundai"); // Calling the parent constructor with alredy known manufacturer
this.variant = variant;
}
@Override
public void bootSpace() { // Implementation of the interface method
System.out.println("The bootspace of Elantra is: " + IsSedan.bootSpace +" litres");
}
@Override
public void printDetails() { // Overriding the parent class's inherited method
super.printDetails(); // Calling the method from parent class
System.out.println("The variant of Elantra is: " + variant); // printing the data member of this class
}
} // End of Elantra class
class Main {
public static void main(String[] args) {
Elantra sport = new Elantra(2019, "Sport"); //creating Sports variant Elantra
Elantra eco = new Elantra(2018, "Eco"); //creating Eco variant Elantra
sport.printDetails();
sport.bootSpace();
System.out.println();
eco.printDetails();
eco.bootSpace();
}
}
اکنون که وراثت چندگانه را پیاده سازی کردیم ، بیایید نگاهی به تفاوت بین یک اینترفیس و یک کلاس انتزاعی بیندازیم.
مقایسه اینترفیس با کلاس انتزاعی
از اینترفیس ها و کلاس های انتزاعی برای دستیابی به انتزاع استفاده می شود اما با برخی تفاوت های اصلی:
اینترفیس ها | کلاس های انتزاعی |
---|---|
از وراثت چندگانه پیشتیبانی می کنند | از وراثت چندگانه پیشتیبانی نمی کنند |
همه اعضا public هستند | می توانند اعضای private , protected , public داشته باشند |
همه اعضای داده ای استاتیک و فاینال هستند | می توانند اعضای داده ای غیر استاتیک و غیر فاینال داشته باشند |
نمی توانند متد سازنده داشته باشند | می توانند متد سازنده داشته باشند |