Trong C#, `overload` và `override` là hai khái niệm rất dễ bị nhầm vì đều liên quan đến việc có nhiều method cùng tên hoặc nhiều implementation khác nhau.
Tuy nhiên, bản chất của chúng hoàn toàn khác nhau:
– **Overload**: cùng tên method nhưng khác danh sách tham số.
– **Override**: class con thay đổi implementation của method được định nghĩa ở class cha.
Đây cũng là chủ đề xuất hiện rất thường xuyên trong các buổi phỏng vấn .NET, đặc biệt ở level Middle hoặc Senior.
Trong bài này chúng ta sẽ đi qua:
– Overload là gì?
– Override là gì?
– Compile-time và runtime polymorphism.
– Risk của overload.
– Risk của override.
– `new` khác `override` như thế nào.
– Các câu hỏi phỏng vấn phổ biến.
—
## 1. Overload là gì?
Method Overloading cho phép chúng ta tạo nhiều method có cùng tên nhưng khác nhau về parameter list.
Ví dụ:
“`csharp
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
public int Add(int a, int b, int c)
{
return a + b + c;
}
}
“`
Chúng ta có ba method cùng tên:
“`text
Add
“`
nhưng parameter khác nhau:
“`text
Add(int, int)
Add(double, double)
Add(int, int, int)
“`
Khi gọi:
“`csharp
calculator.Add(1, 2);
calculator.Add(1.5, 2.5);
calculator.Add(1, 2, 3);
“`
compiler sẽ xác định method nào phù hợp.
—
## 2. Overload được quyết định ở compile time
Overload thường được gọi là:
> Compile-time polymorphism.
Ví dụ:
“`csharp
void Print(int value)
{
Console.WriteLine(“int”);
}
void Print(string value)
{
Console.WriteLine(“string”);
}
“`
Khi viết:
“`csharp
Print(10);
“`
compiler xác định:
“`text
Print(int)
“`
Còn:
“`csharp
Print(“Hello”);
“`
compiler chọn:
“`text
Print(string)
“`
Việc chọn overload được thực hiện trước khi chương trình chạy.
—
## 3. Có thể overload dự