Chuyển tới nội dung chính

Phân biệt Interface và Abstract class

3. Chỗ nào cho Abstract class?

Thông thường, nếu 2 class có những điểm chung về code thì ta sẽ viết các điểm chung đó vào class cha và viết điểm riêng vào 2 class con.

Giả sử cả 3 Implementation ở ví dụ trên đều có phần code method sound() là giống nhau, thì tốt nhất là ta nên chuyển method sound lên Abstract class.

  • Vì Abstract class phải implement interfact TypeC, do đó nó phải implement cả 2 method sound() và display(), nhưng nó lại ko muốn implement method display() vì đây là phần riêng của mỗi implementation nên ở nó sẽ đánh dấu method này là abstract, những class con phải tự override.
  • Do thằng class cha này có 1 method dạng abstract –> class cha này ko phải là 1 thực thể, nó chỉ là 1 thằng cha ảo và nó ở trạng thái imcomplete (có method abstract – ko có nội dung của method), để tránh side effect, java force (bắt buộc) phải có keyword abstract chỗ class để client ko thể khởi tạo nhầm.

Bạn có thể sẽ nhìn thấy cái pattern này ở trong nhiều thư viện khác nhau và giờ chắc bạn đã hiểu vì sao ở các thư viện, nó cho phép mình viết custom implementation thì người ta thường hướng dẫn bạn nên extend từ Abstract class thay vì implement trực tiếp từ Interface.

Nếu bạn vẫn chưa hiểu vì sao thì đây là câu trả lời:

  • Interface trong các thư viện thường được extend từ 1 vài interface khác nên nó thường có rất nhiều method. Nếu mình implement trực tiếp từ các Interface đó thì mình sẽ phải đọc rất nhiều các defined implementation của ngta để biết phải viết cái gì.
  • Tuy nhiên, nếu mình extend từ Abstract class thì mình chỉ phải implement 1 hoặc 2 methods thôi, như thế dễ cho mình hơn.