#Notes: Trong C#, có sự khác biệt gì giữa interface với abstract? Khi nào nên dùng interface? Khi nào nên dùng abstract? Overload với override khác nhau ở chổ nào?

 

So sánh Abstract và Interface


Giống nhau:
- Đều không thể khởi tạo đối tượng bên trong được.
- Đều có thể khai báo các phương thức nhưng không thực hiện chúng.
- Đều bao gồm các phương thức abstract.
- Đều được thực thi từ các lớp con hay còn gọi kế thừa, dẫn xuất.
- Đều có thể kế thừa từ nhiều interface.

Abstract Class
- Cho phép khai báo field, const
- Các phương thức có thể có thân hàm hoặc không có thân hàm.
- Lớp con chỉ kế thừa được từ 1 abstract class và nhiều interface.
- Khi lớp con kế thừa phải dùng từ khóa override
- Có chứa constructor, deconstructor
- Các phương thức có từ khóa access modifier

Interface
- Không cho phép khai báo field, const
- Chỉ khai báo không có thân hàm
- Lớp con có thể triển khai nhiều interface.
- Khi lớp con kế thừa không dùng từ khóa override để implement
- Không có constructor, deconstructor
- Không có các phương thức có từ khóa access modifier

Khi nào dùng Abstract class?
- Khi chúng ta muốn xây dựng một lớp là lớp cha cho các lớp con có cùng bản chất (kiểu, loại, nhiệm vụ lớp), mang tính kế thừa thuộc tính và phương thức của nó.
- Khi chúng ta muốn vừa định nghĩa hoàn chỉnh phương thức bên trong Abstract Class (phương thức thường, hoặc phương thức đi kèm với từ khóa virtual), vừa chưa muốn hoàn thiện phương thức(phương thức đi kèm với từ khóa abstract).
- Các phương thức chưa hoàn thiện sẽ được sử dụng cho nhiều đối tượng có cùng bản chất, và mỗi đối tượng sẽ tự định nghĩa để thực hiện theo mỗi cách khác nhau phù hợp với đối tượng đó.

Khi nào dùng Interface?
- Khi muốn sử dụng đa kế thừa.
- Khi muốn che giấu cách thức xử lý bên trong hoặc sử dụng DI đối với các thành phần khác.
– Khi muốn áp dụng một số hành động cho nhiều class khác nhau, các class này có thể cùng hoặc khác bản chất.
- Ràng buộc các lớp kế thừa phải định nghĩa lại các quy tắc mà chúng ta đã đề ra trong interface.

So sánh Overload và Override

Overloading là một kĩ thuật cho phép trong cùng một class có thể có nhiều phương thức cùng tên nhưng khác nhau về số lượng tham số hoặc kiểu dữ liệu tham số.
Overrding được sử dụng trong trường hợp lớp con kế thừa từ lớp cha và muốn định nghĩa lại một phương thức đã có mặt ở lớp cha.
Một lớp cha thông thường có thể có nhiều lớp con kế thừa, tuy nhiên phương thức ở lớp cha có thể phù hợp với lớp con này nhưng không phù hợp với lớp con khác, do đó lớp con cần ghi đè lại phương thức đó cho phù hợp.

Overload:
- Thể hiện đa hình tại compile time
- Thêm hoặc mở rộng cho hành vi của phương thức.
- Có thể khác nhau về số lượng và kiểu dữ liệu của tham số
- Các phương thức nạp chồng có thể có quyền truy cập khác nhau.
- Xảy ra trong cùng một class

Override:
- Thể hiện đa hình tại runtime
- Thay đổi hành vi hiện tại của phương thức
- Số lượng và kiểu dữ liệu của tham số phải giống nhau
- Phương thức ghi đè ở lớp con phải có quyền truy cập bằng hoặc lớn hơn phương thức được ghi đè ở lớp cha.
- Xảy ra ở 2 class có quan hệ kế thừa

Tags:

Share:

0 nhận xét