6.2.2 Tương thích kiểu – trường hợp phức tạp hơn (1)

Chúng tôi đã sửa lại ví dụ ở trang trước. Chúng ta vẫn có hai class là Dog và Cat, nhưng chúng ta đã đặt chúng vào cùng một cây thừa kế. Hãy xem →

Các lớp DogCat bây giờ cùng là hậu duệ của một lớp cơ sở là Pet. Tất cả các class đều đã được trang bị hàm khởi tạo, cho phép chúng ta cung cấp tên cho tất cả các đối tượng sẽ được tạo ra.

* Hãy tóm tắt những gì chúng ta tạo ra:

  • Các đối tượng có nguồn gốc từ lớp Pet có thể chạy
  • Các đối tượng có nguồn gốc từ các lớp Dog Cat có thể chạy (chúng kế thừa khả năng này từ lớp cha của chúng); chúng cũng có thể tạo ra âm thanh (lưu ý rằng kỹ năng này không có sẵn cho các đối tượng của lớp Pet)

* Và như vậy:

  • Cat Dog có thể làm tất cả những gì mà Pet có thể làm
  • Pet không thể làm tất cả những gì mà CatDog có thể làm

* Chúng ta sẽ nói lại lần nữa, nhưng lần này sử dụng ít thuật ngữ về “động vật” hơn:

  • Các đối tượng của phân lớp (lớp con) luôn có các khả năng giống như các đối tượng lớp cơ sở (lớp cha)
  • Các đối tượng của lớp cơ sở (lớp cha) có thể không có khả năng giống như các đối tượng của phân lớp (lớp con)

* Điều này dẫn chúng ta tới kết luận sau:

  • Các đối tượng của lớp cơ sở (lớp cha) tương thích với các đối tượng của phân lớp (lớp con)
  • Các đối tượng của phân lớp (lớp con) không tương thích với các đối tượng của lớp cơ sở (lớp cha)

* Điều này có nghĩa rằng:

  • Bạn có thể thực hiện các lệnh sau:

nhưng không được làm như thế này

bởi vì Pet không biết làm thế nào để tạo ra âm thanh.

  • Bạn không được phép thực hiện các lệnh sau:

* Hãy quay trở lại với chương trình ví dụ bên trên, nó sẽ cho ra kết quả như sau:

pet: I’m running

Spike: I’m running

Spike: Woof! Woof!

Tom: I’m running

Tom: Meow! Meow!