Interface khác class như thế nào

Khác nhau giữa abstract class và interface khi nào dùng chúng

  • Report
  • Add to my series

This post hasn't been updated for 2 years

Nhắc đến Interfaceabstract class hãy nhớ 2 từ này khá clear rồi, Khi sử dụng Interface là bạn Implement còn sử dụng abstract class là bạn extend

  • Interface:
    • Không phải là class.
    • Chỉ chứa những method/properties trống không có thực thi.
    • Nó giống như một khuôn mẫu, một khung để để các lớp implement và follow.
    • Các lớp có thể implements nhiều interface.
    • Là một contract, các class implement phải triển khai các method theo như interface đã định nghĩa.
  • Abstract class:
    • Khá giống Interface nhưng nó có thể làm nhiều việc hơn.
    • Có 2 loại method là abstract method và method thường:
      • abstract method là method trống không có thực thi.
      • method thường là method có thực thi.
    • Các lớp chỉ có thể kế thừa một Abstract class
    • Hướng đến tính năng và những tính năng có thực thi được sử dụng làm hàm chung cho các class extend.

Đi vào ví dụ bằng code cho từng loại nhé: Interface

Như bạn thấy, mặc dù cả McQueen và Bolt đều được hiện thực interface Runable, nhưng chúng hoàn toàn thuộc hai loại khác nhau. Và tất nhiên một class có thể can-do nhiều thứ, ví dụ như Bolt có thể chạy và sủa.

Dùng Interface như một “bản thiết kế” của class? Đây là một điều thường được dùng để trả lời cho hai câu hỏi:

  • Interface được dùng để làm gì?
  • Tại sao không thể định nghĩa phần thân cho các phương thức của interface.

Xét ở một mức độ nào đó điều này là hợp lý, nhưng như đã nói ở phần trên, nó chỉ được dùng để mô tả một bản thiết kế cho một chức năng của class. Nếu muốn tạo một bản thiết kế tổng thể, hãy sử dụng abstract class. Một bản thiết kế tổng thể tất nhiên sẽ có những thứ đã được dựng sẵn và có những thứ là abstract.

Một câu trả lời có thể lý giải phần nào câu hỏi thứ hai là việc cho phép định nghĩa thân phương thức trong các interface có thể khiến cho hiệu suất bị giảm sút. Nguyên nhân là việc tìm kiếm các phương thức sẽ diễn ra lâu hơn vì phải duyệt qua các interface, thay vì chỉ cần phải tìm trong class cha của nó.

Về công dụng của interface, xét ở mức ứng dụng, các interface có thể được hiểu như các plugin hoặc thư viện/phần mềm third-party. Việc hiện thực một interface cho class cũng giống như cài thêm plugin cho một phần mềm vậy.

Bảng so sánh abstract class và interface để biết khi nào dùng chúng

Cuối cùng, cũng nên liệt kê các điểm khác biệt giữa hai khái niệm này để bạn có thể sử dụng được khi cần thiết. Các điểm khác biệt này có thể khác nhau tùy vào ngôn ngữ mà bạn sử dụng. Vì vậy bạn chỉ cần nhớ các điểm căn bản sau:

Interface Abstract class
Multiple inheritance Một class có thể hiện thực nhiều interface.[tạm coi là thừa kế] Không hỗ trợ đa thừa kế
Default implementation Không thể định nghĩa code xử lý, chỉ có thể khai báo. Có thể định nghĩa thân phương thức, property.
Access Modifiers Mọi phương thức, property đều mặc định là public. Có thể xác định modifier.
Adding functionality Mọi phương thức, property của interface cần được hiện thực trong class. Không cần thiết.
Fields and Constants Không

Interface trong C#

Có thể hiểu đơn giản Interface là một bản thiết kế cho bất kì class muốn thực hiện nó. Nghĩa là nó chỉ có phần khai báo các phương thức/sự kiện và thuộc tính. Các class muốn thực hiện Interface này sẽ viết code implement cho tất cả các khai báo của Interface này.

Các tính chất của Interface

  • Interface không cung cấp việc kế thừa như Class hay Abstract Class mà nó chỉ khai báo phương thức/sự kiện để các lớp khác thực hiện nó.
  • Nó không được khởi tạo nhưng nó có thể được tham chiếu bởi đối tượng của lớp thực hiện nó. ví dụ:
IUserRepository user = new UserRepository[];
  • Không có interface lồng nhau [nested interface]
  • Không có constructor, destructor, constants, static và variable.
  • Một interface có thể kế thừa từ một hoặc nhiều interface khác.
public interface IList : ICollection, IEnumerable, IEnumerable
  • Một interface có thể mở rộng một interface khác.
  • Một class có thể implement một hoặc nhiều interfaces.
  • Mọi phương thức, property đều mặc định là public.

Abstract Class trong C#

Lớp trừu tượng [Abstract Class] là một loại lớp đặc biệt không thể khởi tạo được và nó hoạt động như một lớp cơ sở cho các lớp khác.

Mục đích của Abstract Class là cung cấp các chức năng cơ bản mặc định hoặc các chức năng chung chung mà các lớp dẫn suất có thể thực hiện và ghi đè. Nghĩa là, bạn có thể viết định nghĩa cho phương thức trong Abstract Class, các phương thức trong Abstract Class có thể vừa trừu tượng vừa cụ thể.

Các tính chất của Abstract Class

  • Một Abstract Class không thể được khởi tạo.
  • Abstract Class có thể chứa các phương thức trừu tượng và cụ thể [abstract method – virtual method].
  • Một Abstract Class không thể là một Sealed Class. Vì Sealed Class không cho phép kế thừa.
  • Không thể kế thừa từ một Class hay Interface.
  • Lớp dẫn xuất từ Abstract Class phải implement tất cả cácabstract methodscủa Abstract Class đó.
  • Trong Abstract Class thì cácabstract methodchỉ có khai báo. Cònvirtual methodthì có thể được định nghĩa.
  • Abstract Class có thể dùng các access modifiers như: private, protected, internal. Nhưng cácabstract/virtual methodsthì không thể dùng private.
  • Abstract Class có thể có contructor, destructor, constants, fields
  • Không hỗ trợ đa kế thừa.
using System; namespace ConsoleApp1 { class Program { static void Main[string[] args] { SampleClass sc = new SampleClass[]; //AbsSimpleClass absSimpleClass = new AbsSimpleClass[]; // Error here sc.Paint[]; Console.ReadKey[]; //Output: //--> AbsSimpleClass constructor here //--> Paint method here } public abstract class AbsSimpleClass { public AbsSimpleClass[] { Console.WriteLine["AbsSimpleClass constructor here"]; } public abstract void DoSomething[]; public virtual void Paint[] { Console.WriteLine["Paint method here"]; } } public class SampleClass : AbsSimpleClass { public override void DoSomething[] { Console.WriteLine["Do something here"]; } } } }

Sự khác nhau giữa Abstract class và Interface

Abstract class và interface đều được sử dụng để có được sự trừu tượng mà ở đó chúng ta có thể khai báo các phương thức trừu tượng. Nhưng có một vài sự khác nhau giữa abstract class và interface được liệt kê trong bảng sau:

Abstract classInterface
1] Abstract class có phương thức abstract [không có thân hàm] và phương thức non-abstract [có thân hàm].Interface chỉ có phương thức abstract. Từ java 8, nó có thêm các phương thức default và static.
2] Abstract class không hỗ trợ đa kế thừa.Interface có hỗ trợ đa kế thừa
3] Abstract class có các biến final, non-final, static and non-static.Interface chỉ có các biến static và final.
4] Abstract class có thể cung cấp nội dung cài đặt cho phương thức của interface.Interface không thể cung cấp nội dung cài đặt cho phương thức của abstract class.
5] Từ khóa abstract được sử dụng để khai báo abstract class.Từ khóa interface được sử dụng để khai báo interface.
6] Ví dụ:
public abstract class Shape {
public abstract void draw[];
}
Ví dụ:
public interface Drawable {
void draw[];
}

Đơn giản để hiểu, đó là abstract class có được trừu tượng 1 phần [0 tới 100%], còn interface có được trừu tường toàn phần [100%].


Abstract class

Giả sử bạn có hai lớp là ConNguoi và ConCho, có một thuộc tính là viTri. Cả hai lớp này đều có một hàm thaydoiViTri, nhận vào một tọa độ và cập nhật tọa độ mới cho hai đối tượng thuộc hai lớp này. Như vậy bạn phải viết hai đoạn mã nguồn giống nhau cho hai lớp khác nhau.

Vậy có cách nào tái sử dụng đoạn mã nguồn này không? Bạn có thể tạo một lớp cha của hai lớp này là lớp DongVat, cài đặt phương thức thaydoiViTri. Nhưng điều này sẽ gây ra vấn đề khi có một người khác sử dụng thư viện do bạn viết ra, người ta có thể tạo một đối tượng của lớp ĐộngVật mà thực tế, đối tượng đó không có ý nghĩa và sẽ làm sai hoạt động của thư viện bạn viết ra.

Lúc đó người ta nghĩ ra khái niệm abstract class, là một lớp nhưng không thể tạo ra thực thể. Về mặt kỹ thuật, abstract class có thể chứa hoặc không chứa phương thức abstract - một phương thức chỉ có khai báo mà không chứa cài đặt.

Video liên quan

Chủ Đề