Composition là kỹ thuật thiết kế mà lớp của bạn có thể có một instance của lớp khác làm trường (field) của lớp mình. Inheritance (kế thừa) là cơ chế mà đối tượng có thể获得属性和行为 của đối tượng cha bằng cách extends một lớp.
Cả Composition và Inheritance đều cung cấp tái sử dụng code bằng cách liên kết lớp. Chúng ta cũng có thể đạt được chức năng của inheritance khi dùng composition. Dưới đây là các khác biệt.
| STT | Tiêu chí | Inheritance | Composition |
|---|---|---|---|
| 1 | Cơ bản | Inheritance là mối quan hệ "is-a" (là một). | Composition là mối quan hệ "has-a" (có một). |
| 2 | Tái sử dụng code | Trong Inheritance, một class chỉ extends một class, do đó chỉ tái dùng code trong một class cha. | Có thể tái dùng code từ nhiều class. |
| 3 | Phạm vi | Inheritance cung cấp tính năng tại compile-time. | Composition dễ dàng đạt được tại runtime. |
| 4 | Final class | Không thể tái dùng code từ final class. | Cho phép tái dùng code ngay cả từ final class. |
| 5 | Phương thức | Công khai (expose) cả phương thức public và protected của lớp cha. | Không công khai. Chúng tương tác qua public interface. |
Ví dụ Inheritance
class Animal {
String name = "Orio";
}
class Dog extends Animal {
String type = "Dog";
public static void main(String args[]) {
Dog p = new Dog();
System.out.println("Name: " + p.name);
System.out.println("Type: " + p.type);
}
}
Ví dụ Composition
public class Student { }
public class College {
private Student student;
public College() {
this.student = new Student();
}
}