Sự khác biệt giữa interface và abstract class là gì?

Interfaces

Một giao diện tương tự như một lớp trừu tượng; thực sự các giao diện chiếm cùng một không gian tên như các lớp và các lớp trừu tượng. Vì lý do đó, bạn không thể xác định giao diện có cùng tên với một lớp. Giao diện là một lớp trừu tượng hoàn toàn; không có phương thức nào của nó được thực hiện và thay vì một phân lớp con từ nó, nó được cho là thực hiện giao diện đó.

Giao diện là một hợp đồng: Người viết giao diện nói, "này, tôi chấp nhận mọi thứ theo cách đó", và người sử dụng giao diện nói "OK, lớp tôi viết trông như vậy".

Giao diện là một trình bao rỗng. Chỉ có các ký hiệu của các phương thức, điều này ngụ ý rằng các phương thức không có phần thân. Giao diện không thể làm bất cứ điều gì. Nó chỉ là một khuôn mẫu.

Abstract classes

Một lớp trừu tượng là một lớp chỉ được người lập trình thực hiện một phần. Nó có thể chứa một hoặc nhiều phương thức trừu tượng. Một phương thức trừu tượng chỉ đơn giản là một định nghĩa hàm dùng để cho người lập trình biết rằng phương thức đó phải được thực hiện trong một lớp con.

Các lớp trừu tượng, không giống như các giao diện, là các lớp. Chúng đắt hơn để sử dụng, bởi vì bạn phải xem xét khi kế thừa từ chúng.

Các lớp trừu tượng trông rất giống các giao diện, nhưng chúng có một cái gì đó hơn thế nữa: Bạn có thể xác định một hành vi cho chúng. Nó nói nhiều hơn về một người nói, "các lớp này nên trông như thế, và chúng có điểm chung, vì vậy hãy điền vào chỗ trống!".

The key technical differences between an abstract class and an interface are:
  • Các lớp trừu tượng có thể có hằng số, thành viên, phần gốc của phương thức (phương thức không có phần thân) và các phương thức được xác định, trong khi các giao diện chỉ có thể có hằng số và phần khai của phương thức.
  • Các phương thức và thành viên của một lớp trừu tượng có thể được định nghĩa với bất kỳ khả năng hiển thị nào, trong khi tất cả các phương thức của một giao diện phải được định nghĩa là công khai (chúng được định nghĩa công khai theo mặc định).
  • Khi kế thừa một lớp trừu tượng, một lớp con cụ thể phải định nghĩa các phương thức trừu tượng, trong khi một lớp trừu tượng có thể mở rộng một lớp trừu tượng khác và các phương thức trừu tượng từ lớp cha không cần phải được định nghĩa.
  • Tương tự, một giao diện mở rộng giao diện khác không chịu trách nhiệm triển khai các phương thức từ giao diện mẹ. Điều này là do các giao diện không thể xác định bất kỳ triển khai nào.
  • Một lớp con chỉ có thể mở rộng một lớp duy nhất (trừu tượng hoặc cụ thể), trong khi một giao diện có thể mở rộng hoặc một lớp có thể triển khai nhiều giao diện khác.
  • Một lớp con có thể định nghĩa các phương thức trừu tượng có cùng khả năng hiển thị hoặc ít hạn chế hơn, trong khi một lớp triển khai giao diện phải xác định các phương thức có cùng khả năng hiển thị chính xác (công khai).