Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Mối quan hệ inheritance (is-a) vs composition (has-a) trong Java


Mối quan hệ IS-A

IS-A nói: Object này là kiểu của object kia. Xem cách từ khóa extends đạt được inheritance.

public class Animal { }
public class Mammal extends Animal { }
public class Reptile extends Animal { }
public class Dog extends Mammal { }

Xét IS-A relationship:

  • Mammal IS-A Animal
  • Reptile IS-A Animal
  • Dog IS-A Mammal
  • Do đó: Dog IS-A Animal cũng vậy

Với extends, subclass kế thừa tất cả property của superclass trừ private property.

Ta xác nhận Mammal thực sự là Animal bằng toán tử instanceof.

Ví dụ

class Animal { }
class Mammal extends Animal { }
class Reptile extends Animal { }
public class Dog extends Mammal {
    public static void main(String args[]) {
        Animal a = new Animal();
        Mammal m = new Mammal();
        Dog d = new Dog();
        System.out.println(m instanceof Animal);
        System.out.println(d instanceof Mammal);
        System.out.println(d instanceof Animal);
    }
}

Kết quả:

Kết quả

true
true
true

Mối quan hệ HAS-A

Mối quan hệ này chủ yếu dựa trên usage (sử dụng). Xác định class có HAS-A certain thing. Giúp giảm duplicate code và bugs.

Xem ví dụ:

Ví dụ

public class Vehicle { }
public class Speed { }
public class Van extends Vehicle {
    private Speed sp;
}

Đây cho thấy class Van HAS-A Speed. Bằng cách tách class Speed, không phải nhét toàn bộ code speed vào Van, giúp tái sử dụng Speed class cho nhiều ứng dụng.

Trong tính năng OOP, user không cần lo object nào làm việc thực. Để đạt được, Van class ẩn implementation details từ user của Van class. Vậy user yêu cầu Van class làm action, Van class tự làm hoặc nhờ class khác làm.