Abstract vs Interface. So sánh interface và abstract

1. Lớp dạng abstract là gì?

Lớp dạng abstract là một loại lớp đặc biệt mà chúng ta không thể khởi tạo được. Câu hỏi đặt ra là tại sao chúng ta cần một lớp không thể khởi tạo được vậy cà?

Vì lớp dạng abstract chỉ cho phép lớp khác thừa kế từ nó và không thể khởi tạo nó. Ưu điểm này là nó ép tạo ra hệ thống cây phân cấp cho tất cả các lớp con. Nói cách đơn giản, lớp abstract như là “giao kèo” mà bắt buộc tất cả các lớp con đi theo cùng tiêu chuẩn tương tự nhau.

2. Interface là gì?

Interface không phải là lớp. Đó là một thực thể được định nghĩa bởi từ khóa interface. Interface không có người thực hiện; nó chỉ có dấu hiệu hay nói cách khác, chỉ định nghĩa những phương thức rỗng. Interface có một điểm tương đông với lớp dạng Abstract, nó là một “giao kèo” được sử dụng để xác định phân cấp cho tất cả các lớp con hoặc nó định nghĩa tập các phương thức và các đối số của nó. Sự khác biệt chính giữa chúng là một lớp có thể thực hiện nhiều hơn một interface nhưng chỉ có thể kế thừa từ MỘT lớp dạng abstract. Vì C # không hỗ trợ đa kế thừa, giao diện được sử dụng để thực hiện đa kế thừa.

3. So sánh interface và abstract
Khi chúng ta tạo ra một interface, chúng ta về cơ bản tạo ra một tập các phương thức rỗng và những phương thức rỗng này sẽ được “đong đầy” bởi những lớp nào thực thi interface. Ưu điểm là nó giúp cho một lớp trở thành một phần của hai lớp: một là từ thừa kế và một là từ interface.

Khi chúng ta tạo một lớp trừu tượng, chúng ta đang tạo ra một lớp cơ sở có thể có một hoặc nhiều phương thức hoàn chỉnh nhưng ít nhất một hoặc nhiều phương thức còn lại dở dang và khai báo abstract. Nếu tất cả các phương thức của một lớp dạng abstract là dở dang thì nó là giống như một interface thôi. Mục đích của một lớp trừu tượng là cung cấp định nghĩa cơ sở cho các lớp dẫn xuất (lớp con của nó) sẽ làm việc và sau đó cho phép các lập trình viên viết code cho việc thực thi các phương thức.

Có một số điểm tương đồng và khác biệt giữa interface và lớp dạng abstract mà tôi đã sắp xếp trong một bảng để dễ dàng so sánh:

#Tính năngInterfaceLớp dạng Abstract
1Đa thừa kếMột lớp có thể thừa kế nhiều interface.Một lớp chỉ thừa kế một lớp dạng trừu tượng.
2Việc thực thi mặc địnhInterface không thể cung cấp bất kì code, nó chỉ là những dấu hiệuLớp dạng abstract có thể cung cấp code hoàn chỉnh hoặc chỉ cung cấp những chi tiết phải bị ghi đè bởi lớp con
3Access ModfiersInterface không có access modifiers cho phương thức, thuộc tính, Mọi thứ được giả định là publicLớp dạng abstract có thể chứa access modifier cho phương thức, thuộc tính…
4Core VS PeripheralInterface dùng để định nghĩa những khả năng bên ngoài của một lớp. Ví dụ như lớp Human và lớp Vehicle có thể thực thi IMovable interface.Lớp dạng abstract định nghĩa cốt lõi của một lớp và sử dụng cho những object cùng kiểu.
5HomogeneityNếu những việc thực thi khác nhau chỉ chia sẻ những “dấu hiệu” của phương thức, khi đó chúng ta nên sử dụng interfaceNếu những việc thực thi khác nhau cùng loại và có những thứ chung như status, behavior, khi đó chúng ta nên sử dụng lớp dạng abstract.
6SpeedCần nhiều thời gian để tìm phương thức thực tế tương ứng với lớp.Nhanh
7Adding functionality (Versioning)Nếu chúng ta thêm một phương thức mới vào interface khi đó chúng ta phải lùng sục hết tất cả các lớp nào đang thực thi interface và định nghĩa thực thi cho phương thức mới.Nếu chúng ta thêm phương thúc mới vào lớp dạng abstract chúng ta có thể lựa chọn cung cấp những thực thi mặc định và do đó tất cả các code đang tồn tại vẫn chạy bình thường.
8Fields and ConstantsKhông thể định nghĩa trong interfaceLớp dạng abstract có thể định nghĩa

 

Sliding Sidebar

About Me

About Me

Hello, my name is Dũng (Johnny). Welcome to my blog.

As I’m a developer, I write about topics related to the field of programming, mainly from a technical point of view. On this blog you’ll find posts which encourage discussion, information about development trends, case studies, reviews, tutorials, tips on how to improve your effectiveness, and anything else that might be fascinating to people from the IT industry.
I love PHP, NodeJS, Java,... and Fullstack.