[Concept] – Inheritance và Interfaces

Có lẽ dễ nhận ra sự khác biệt giữa Inheritance và Interfaces, nhưng việc sử dụng chúng đôi lúc không rõ ràng. 

Inheritance: một class kế thừa (lớp dẫn xuất) từ lớp khác (base class).  Lớp dẫn xuất là mở rộng của lớp cha. Nó chứa tất cả những thành phần (thuộc tính, phương thức) của lớp cha, có thể mở rộng thêm thành phần mới, hoặc có thể reimplement lại những phương thức ảo của lớp cha.

Một số ngôn ngữ, như C++, hỗ trợ đa kế thừa, 1 class có thể kế thừa từ nhiều class cha, nhưng thường thì không khuyến khích.

Interfaces: chỉ định nghĩa những phương thức mà không có thuộc tính (ở C# cho phép các thuộc tính kiểu property), và 1 class có thể implement từ nhiều Interfaces.

Một class kế thừa từ lớp cha, ngay lập tức sẽ được thừa hưởng và sử dụng tất cả thành phần từ lớp cha.

Một class muốn thực hiện một interface phải viết lại tất cả các phương thức có trong interface đó.

Sử dụng khi nào?

Nếu bạn cần 1 class có nhiều lớp cha, nhưng trong 1 số ngôn ngữ lập trình không cho phép đa kế thừa. Hoặc khi bạn sử dụng lại 1 đối tượng trong thư viện, phải sử dụng 1 (concept) phù hợp, tùy thuộc vào đối tượng thư viện đó là class hay là interface.

Chọn cái nào để sử dụng?

Về cơ bản, lớp cơ sở mô tả và thực hiện những hành vi chung của những đối tượng liên quan, trong khi interface mô tả chức năng của những đối tượng có thể không liên quan. Kế thừa mô tả mối quan hệ “IS-A”, interface mô tả mối quan hệ “BEHAVES LIKE” (hành vi giống nhau).

Xem xét thêm:

  • Interfaces thì cố định. Khi bạn thay đổi 1 interface, bạn phải thay đổi tất cả những class mà implement từ interface. Nhưng khi bạn thay đổi 1 lớp cơ sở, mỗi lớp dẫn xuất tự sẽ có có những hành vi khác, có 2 mặt. Mặt tốt: nếu bạn sửa 1 lỗi trong lớp cha, ở các lớp con sẽ được thay đổi theo; ngược lại, nếu thay đổi lớp cha mà làm nảy sinh lỗi thì tất cả lớp con sẽ mang theo lỗi đó.
  • Interfaces thì được dùng linh hoạt hơn, vì nhiều ngôn ngữ chỉ cho phép kế thừa từ 1 class, nhưng có thể nhiều interfaces.
  • Interfaces giúp bảo vệ những internal class: Ví dụ, class A có 1 internal object b của lớp B. Khi 1 phương thức trong A trả lại 1 con trỏ hay tham chiếu tới b, đoạn mã gọi phương thức này sẽ truy cập tới những thành phần bên trong đối tượng b, điều này có chút nguy cơ, vì A chỉ muốn lấy ra 1 số trong b thôi. Có thể giải quyết vấn đề này bằng cách tạo ra 1 interface cho những thành phần cần lấy ra thôi. Khi B implement interface này, phương thức trong A trả lại b thông qua con trỏ hay tham chiếu, thì phía bên ngoài chỉ có thể làm việc với phần cho phép thông qua interface. ( ? code demo).

==> Tham khảo thêm bài viết khác liên quan

Nguồn internet: http://edwardthienhoang.wordpress.com/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s