Lập trình C#

Overload trong lập trình C#

Overload trong lập trình C#
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

Trong OOP (Object Oriented Programming), overridingoverloading 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ì?
  2. Làm thế nào compiler phân biệt được các overload methods?
  3. Overloading constructors
1. Overload là gì?
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ề.

class DemoOverloading
{
	public int Sum(int A, int B)
	{
		return A + B;
	}

	public float Sum(int A, float B)
	{
		return A + B;
	}
}

– 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:

class Student
{
	public string GetName(int masv) {…}

	public string GetName(string email) {…}
}

– 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?
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:

  1. 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ụ:
  2. 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);
    	}
    }
    
  3. 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ụ:
  4. class Student
    {
    	public string GetName(int masv) {…}
    
    	public string GetName(string email) {…}
    }
    
  5. 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ụ:
  6. class Student
    {
    	public string GetName(int masv, string email) {…}
    
    	public string GetName(string address, int mobile) {…}
    }
    
3. Overloading constructors
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:

class MinhHoangBlog
{
	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);
	}
}

– Nếu thực thi đoạn code này, chúng ta sẽ có kết quả:

Hello from C#.
No worries.
Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!


Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp người đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Bình luận của bạn

avatar

Overload trong lập trình C#

by Minh Hoàng Time to read: 4 min
0