Hệ thống: | MightyLMS - Quản lý giáo dục |
Khoá học: | Phân biệt Interface và Abstract class |
Book: | Phân biệt Interface và Abstract class |
Được in bởi: | Người dùng khách |
Ngày: | Thứ Sáu, 15 tháng 11 2024, 10:14 AM |
Điểm khác biệt cốt lõi cửa 2 thằng này đến từ tư tưởng sử dụng, ko phải đến từ việc thằng này có abc, thằng kia có xyz.
Nếu nhìn vào điểm khác nhau bạn có thể sẽ nghĩ là “2 thứ nó khác nhau rõ ràng như thế này, sao người ta lại đặt ra câu hỏi là phân biệt 2 thứ này nhỉ?”. Tuy nhiên trên thực tế, nhất là trong Java, về mặt functional thì Interface và Abstract class ko khác nhau nhiều. Sau khi bản update ở Java 8, thì Interface và Abstract class lại càng giống nhau hơn.
Nếu bạn so sánh 2 thằng này mà sa đà vào việc đếm thành phần như Interface thì tất cả method ko có nội dung hay Abstract thì có state thì bạn sẽ rơi vào vòng luẩn quẩn, học như thế rất mệt mỏi và sẽ rất rối.
Điểm khác biệt cốt lõi cửa 2 thằng này đến từ tư tưởng sử dụng, ko phải đến từ việc thằng này có abc, thằng kia có xyz.
Nếu nhìn vào điểm khác nhau bạn có thể sẽ nghĩ là “2 thứ nó khác nhau rõ ràng như thế này, sao người ta lại đặt ra câu hỏi là phân biệt 2 thứ này nhỉ?”. Tuy nhiên trên thực tế, nhất là trong Java, về mặt functional thì Interface và Abstract class ko khác nhau nhiều. Sau khi bản update ở Java 8, thì Interface và Abstract class lại càng giống nhau hơn.
Nếu bạn so sánh 2 thằng này mà sa đà vào việc đếm thành phần như Interface thì tất cả method ko có nội dung hay Abstract thì có state thì bạn sẽ rơi vào vòng luẩn quẩn, học như thế rất mệt mỏi và sẽ rất rối.
Về ý nghĩa nói chung, interface trong lập trình như là cách giao tiếp giữa các component, nó ẩn phần implementation. Lấy 1 ví dụ đời thường, coi như chuẩn TypeC kết nối giữa máy tính và màn hình là 1 interface.
Client
Interface
là TypeCImplementation
của InterfaceTypeC định nghĩa là tất cả các màn hình mà có theo chuẩn TypeC thì đều phải có 2 method là: âm thanh sound()
và hình ảnh display()
, để khi máy tính kết nối vào bất kỳ cái màn hình nào cũng sẽ gọi được 2 method này. Contract ở đây là hợp đồng giữa client và interface. Nhiệm vụ của interface lúc này là sẽ force (ép buộc) tất cả các implementation phải tuân theo bản hợp đồng đó –> compile error nếu implementation nào ko override method của interface.
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.
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.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: