theo mình hiểu thì interface,abstract class có ý nghĩa trong việc thiết kế hệ thống theo hướng đối tượng, bạn sẽ hỏi vì sao các method abstract chỉ chứa hàm rỗng rồi sau này lại bắt tôi viết nội dung lại làm vậy chi cho mất công vậy, sao tôi ko cứ viết nội dung hàm cho từng class rồi gọi nó thôi >> ý nghĩa của cái method abstract nó nằm ở mặt thiết kế vì :
giả sử bạn viết 1 đống các lớp cho heo, mèo, gà … và bạn quan sát và đưa ra nhận định
Bọn này sao có nhiều đặc điểm chung quá vậy, thuộc tính : màu lông, kích thước, số lượng chân … và các hành vi : ăn, uống, đi lại >> từ đây bạn có thể phỏng đoán bọn này phải thuộc về 1 lớp gì đó ( cái này nó cũng giống như cách suy luận quy nạp của con người, khi nhìn nhận sự vật hiện tượng ngoài thực tế, mà cái lập trình oop này gốc nó cũng lấy cảm hứng từ việc giả lập lại quá trình tư duy trừu tượng của con người), vậy là bạn tạo ra 1 lớp động vật và xếp đám kia vào lớp này, vậy lợi ích gì ở đậy
- giúp cho chương trình nó được sắp xếp 1 cách có logic và có ý nghĩa >> dễ hiểu >> dễ bảo trì, sửa chữa, khi 1 đứa nào đó đọc vào thấy à đối tượng này là con heo và nó thuộc lớp động vật thì chắc chắn nó sẽ có những thuộc tính này hành vi này
- giúp tái sử dụng mã nguồn, những gì mà cha có thì con chắc chắn có nếu ko cần thay đổi thì lấy lại mà sài khỏi viết lại
- về mặt ý nghĩa vì các lớp heo,gà, mèo được xếp vào lớp động vật vậy nó sẽ bắt buộc phải có đủ mọi tính chất của lớp động vật, nhưng có 1 số hành vi của bọn này thay đổi trên từng con vì vậy tại lớp chung hành vi này sẽ không thể đc định nghĩa rõ ràng đc >> hành vi này sẽ bắt buộc phải được định nghĩa lại tại từng lớp con, ngoài ra đương nhiên sẽ cho phép tồn tại cả những hành vi mà hoàn toàn giống nhau trên tất cả các con vật trong lớp động vật đó, những hành vi này sẽ ko bắt buộc định nghĩa lại
như mình đã nói việc tạo ra các lớp trừu tượng, hàm trừu tượng nó có ý nghĩa về mặt thiết kế hệ thống, tạo ra các ràng buộc bắt buộc để hệ thống logic hơn, và sự ra đời của nó là dựa vào việc bạn phân tích bài toán đến đâu nhiều khi mới vào khách hàng đưa cho abc yêu cầu abc dữ liệu thì chưa thấy đc nguyên 1 hệ thống nhưng dần dần hệ thống to ra lúc đó tòi ra 1 đống đối tượng như nhau lúc đó mới bắt đầu refactor code, nên các dev có kinh nghiệm chinh chiến lâu năm hoặc kiến trúc sư hệ thống họ sẽ xây dựng lên cái khung trước sau này phình ra cũng đỡ phải refactor 1 đống, nói tóm lại mục tiêu nó hướng tới là giúp code dễ hiểu, dễ bảo trì, dễ mở rộng, còn mình đảm bảo viết theo hướng đối tượng sẽ phải viết code nhiều hơn với các kỹ thuật khác, đôi khi mình tự hỏi giữa việc viết 1 chương trình dễ hiểu và 1 chương trình gọn đến mức khó hiểu nhưng chạy nhanh thì người ta sẽ chọn kiểu nào