Khi làm việc với các ngôn ngữ lập trình hướng đối tượng thì hai khái niệm overriding và overloading rất quan trọng và thường sử dụng. Và hai kỹ thuật này giúp tạo nên Tính đa hình (Polymorphism), một trong những sức mạnh của lập trình hướng đối tượng.
– Trước hết các bạn cần nắm hai khái niệm override và overload là gì, rồi mới tiếp tục tìm hiểu tiếp nhé:
– Trong bài viết này chúng ta sẽ cùng tìm hiểu:
1. Sự khác nhau giữa override và overload là gì?
Override | Overload |
– Kiểu dữ liệu trả về, tên phương thức, danh sách tham số của phương thức override và phương thức được override phải giống nhau. | – Kiểu dữ liệu trả về của các phương thức overload có thể giống nhau hoặc khác nhau.
– Số lượng tham số hoặc kiểu dữ liệu của tham số ở các phương thức overload phải khác nhau. |
– Không thể thu hẹp phạm vi truy cập(access modifier) của phương thức được override. | – Có thể mở rộng hoặc thu hẹp phạm vi truy cập(access modifier) của phương thức được overload. |
– Không thể overriding constructor method. | – Overloading được constructor method. |
– Chỉ thực hiện được đối với các class có quan hệ kế thừa. Do đó overriding thực hiện ở ngoài phạm vi của một class. | – Chỉ thực hiện trong cùng phạm vi, trong nội bộ của một class. |
– Là hình thức đa hình khi chạy(runtime) (tức là chỉ khi chương trình chạy, thì chúng ta mới biết phương thức được gọi từ lớp nào). | – Là hình thức đa hình khi biên dịch(compiler) (tức là khi biên dịch mới biết đang sử dụng phương thức ở trong lớp nào). |
– Không cho phép tạo ra những ngoại lệ khác loại hoặc không phải đối tượng thuộc lớp con của lớp có thể hiện là ngoại lệ từ phương thức được override. | – Cho phép tạo ra những ngoại lệ hoàn toàn mới so với những ngoại lệ từ phương thức được overload. |
2. Nên sử dụng override, overload khi nào?
– Sử dụng override khi ở lớp cha có một phương thức thực hiện công việc A, và lớp con khi kế thừa phương thức này nó muốn làm khác đi công việc A đó thì chúng ta sẽ dùng override.
Chẳng hạn, ở lớp cha động vật Animal có phương thức là Eat() { “Động vật ăn cỏ” }, và lớp con cá mập Shark kế thừa method Eat() của lớp động vật, nhưng cá mập thì không ăn cỏ. Do đó mà ở lớp con cá mập chúng ta cần override method Eat() này cho phù hợp là: Eat() { “Cá mập ăn thịt” }.
– Sử dụng overload khi chúng ta muốn chỉ sử dụng một tên method cho nhiều xử lý có ý nghĩa tương tự nhau trong cùng một class, để dễ gợi nhớ, tránh trường hợp đặt nhiều tên method khác nhau mà chúng lại có chung xử lý.
Chẳng hạn, chúng ta muốn lấy tên của một sinh viên trong một lớp học thì có thể có nhiều cách lấy như: dựa vào mã sinh viên, địa chỉ email, dựa vào địa chỉ + số điện thoại,… Và khi đó, có thể bạn sẽ viết ra n method để làm việc này như:
- GetNameByMasv
- GetNameByEmail
- GetNameByAddMobi
- …
Như các bạn thấy rằng, nếu có n cách lấy tên sinh viên thì chúng ta phải viết n method để thực hiện. Làm như vậy sẽ có nhiều hạn chế, thay vì thế bạn sử dụng kỹ thuật overload để chỉ cần viết method có tên là GetName với các tham số truyền vào tương ứng.
=> Điều này sẽ giúp phương thức của chúng ta tránh nhầm lẫn, có ý nghĩa và dễ nhớ.
Kết luận:
– Overriding, overloading là những tính năng rất quan trọng trong một ngôn ngữ hướng đối tượng như C#. Khi được sử dụng chính xác, chúng sẽ rất hữu ích, mạnh mẽ và làm code dễ đọc, dễ hiểu. Khi chúng ta có các method có chức năng tương tự, không cần phải cung cấp cho chúng các tên khác nhau khi chúng ta có thể overloading chúng. Và khi không hài lòng với các chức năng được cung cấp sẵn của method trong lớp cha, chúng ta có thể overriding method đó để đáp ứng nhu cầu của chúng ta.
– Qua bài này, hy vọng các bạn đã phân biệt được override, overload và biết được khi nào thì nên sử dụng trong C#. Sử dụng override và overload không có nghĩa là làm code ngắn hơn, nhưng sẽ làm cho tên phương thức của chúng ta có ý nghĩa và rõ ràng hơn.
.