Trong OOP (Object Oriented Programming), overriding và overloading là 2 kỹ thuật 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. Trong bài viết này chúng ta sẽ tìm hiểu về kỹ thuật overloading:
1. Overload là gì?
– Overload(nạp chồng): là việc tạo ra nhiều phương thức(method) có cùng tên, trong cùng một phạm vi(scope), nhưng khác nhau về đối số đầu vào(arguments) hoặc kiểu trả về.
{
public int Sum(int A, int B)
{
return A + B;
}
public float Sum(int A, float B)
{
return A + B;
}
}
[/code]
– Việc trong cùng phạm vi mà đặt những method có tên giống nhau vì chúng làm các nhiệm vụ tương tự nhau. Ví dụ, nếu chúng ta cần lấy tên sinh viên trong một lớp thì có rất nhiều cách để làm điều đó. Chúng ta có thể lấy tên dựa vào mã số sinh viên và cũng có thể lấy tên bằng email. Khi đó có thể thực hiện như sau:
{
public string GetName(int masv) {…}
public string GetName(string email) {…}
}
[/code]
– Method GetName() được gọi là đã được overload vì có hai implementation nằm trong cùng phạm vi(class scope) và có cùng tên. Nếu 2 method GetName() được khai báo trong các phạm vi khác nhau (ví dụ được khai báo ở các lớp khác nhau) thì method GetName() không được gọi là overload.
– Việc overloading là không bắt buộc. Nó chỉ là một tính năng hữu ích trong các ngôn ngữ hướng đối tượng (như C++, C#, Java,…). Đó là ý nghĩa thông thường vì cả 2 method đang làm khá nhiều điều tương tự nhau. Nếu không thích overload thì bạn có thể đặt tên cho 2 method này là GetNameByMasv(), GetNameByEmail() hay thậm chí là GetName1(), GetName2().
2. Làm thế nào compiler phân biệt được các overload methods?
– Bởi vì khi thực hiện overloading thì các methods sẽ có cùng tên, do đó mà trình biên dịch(compiler) sẽ dựa vào danh sách tham số của các methods để xác định method nào được gọi theo các ngữ cảnh khác nhau.
– Vậy để xác định danh sách tham số của các methods cùng tên là khác nhau khi sử dụng kỹ thuật overloading thì sẽ dựa vào điều gì!? Có ba cách để phân biệt như sau:
- Dựa vào số lượng tham số: chẳng hạn một method có 2 tham số, method khác có 3,… Bằng cách này, trình biên dịch sẽ gọi đúng method với số lượng chính xác của các tham số được truyền vào. Ví dụ: [code language=”csharp”] class Student
- Dựa vào data type của tham số: nếu hai methods có cùng số tham số, nhưng các kiểu khác nhau (int, string, long …), thì trình biên dịch sẽ biết được method nào để gọi. Ví dụ: [code language=”csharp”] class Student
- Dựa vào thứ tự của các tham số: khi chúng ta có một kết hợp số tham số và kiểu tham số, nhưng với một thứ tự khác, thì lại dễ dàng cho trình biên dịch biết method nào cần gọi. Ví dụ: [code language=”csharp”] class Student
{
public string Hello(string name)
{
return "Hello: " + name;
}
public string Hello(string firstName, string lastName)
{
return string.Format("Hello: {0} {1}", firstName, lastName);
}
}
[/code]
{
public string GetName(int masv) {…}
public string GetName(string email) {…}
}
[/code]
{
public string GetName(int masv, string email) {…}
public string GetName(string address, int mobile) {…}
}
[/code]
3. Overloading constructors
– Bạn có thể thực hiện overload đối với constructor method giống như bất kỳ method khác.
– Ví dụ, chúng ta có class Messager với hai method constructors. Một constructor không tham số sẽ dùng thông điệp(message) mặc định và một constructor có tham số thì tham số đó là nội dung của thông điệp được truyền vào. Và thông điệp(message) được hiển thị bằng cách gọi method DisplayMessage(). Chúng ta có phần code minh họa như sau:
{
static void Main(string[] args)
{
Messager msg1 = new Messager();
msg1.DisplayMessage();
Messager msg2 = new Messager( "No worries." );
msg2.DisplayMessage();
Console.ReadKey();
}
}
class Messager
{
public string message;
// Constructor không tham số
public Messager()
{
message = "Hello from C#.";
}
// Constructor có 1 tham số
public Messager(string inMsg)
{
message = inMsg;
}
public void DisplayMessage()
{
System.Console.WriteLine(message);
}
}
[/code]
– Nếu thực thi đoạn code này, chúng ta sẽ có kết quả:
Hello from C#. No worries.
[…] Overload trong lập trình C# – Minh Hoàng Blog | Cùng nhau chia sẻ kiến thức lập t… 1 month ago You need to login to view this […]