Khi nào dùng abstract class và khi nào dùng interface?

- Lê Thị Thùy Trang Interface khi muốn define k muốn impl, abstract khi muốn làm một nửa chừa 1 nửa

- Thien Nguyen: Hình ảnh đầu tiên xuất hiện trong đầu: interface được dùng để định nghĩa một hợp đồng (contract) cho nhiều bên dùng hoặc làm theo. Abtract class dùng để định nghĩa một class chưa đầy đủ và mong muốn các lớp kế thừa phải implement các abstract members
- liskov quy định khi bạn thừa kế 1 cái gì đó thì phải chú ý không làm biến dạng nhóm business logic đó.
Như vậy khi bạn thừa kế 1 abstract class là bạn phải xem xét có phù hợp để class bạn thừa kế hay không, hay nói cách khác là giữa base class và derived class phải có một mối quan hệ ngữ nghĩa theo hướng tổng quát hóa.
Ví dụ abstract class Animal có hàm Run(), mấy class khác như Dog, Cat, Horse có thể thừa kế và override lại hàm Run(), nhưng nếu có class Bike cũng có hàm Run() và thừa kế Animal thì sẽ gây biến dạng logic vì giữa nó và Animal không có mối quan hệ tổng quát hóa.
(Nếu bạn hỏi logic biến dạng ra sao trong ngữ cảnh này thì chẳng hạn như mấy con kia muốn chạy là chạy, còn bike trước khi chạy phải khởi động máy...)

Đó cũng là nguyên nhân chỉ cho phép thừa kế từ 1 abstract class, muốn thừa kế nhiều hơn phải theo từng cấp chiều dọc A:B, B:C, chứ không được theo hàng ngang A:B, C

Với Interface thì mối quan hệ ngữ nghĩa đó không đặt nặng, mà mục đích của nó đặt nặng việc đảm bảo tính khuôn khổ của contract. Nghĩa là anh làm sao thì làm nhưng một khi anh implement theo cấu trúc của contract đó thì anh phải đảm bảo có hàm Run() cho tui gọi theo đúng contract đã thỏa thuận là ok.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/?fbclid=IwAR0K-3g1LIn7FwEnWxAr1sAXvIl7uUrEIOxV_-T4kAqvP6o_PL3zfsoFb6k
Post a Comment