Mở đầu
- Trong bài viết trước chúng ta đã tìm hiểu về 4 tính chất quan trọng trong OOP - lập trình hướng đối tượng
- Trong bài viết này mình sẽ đi sâu vào
tính đa hình (Polymorphism)
và cùng tìm hiểu về 2 phân loại quan trọng:Overriding
vàOverloading
của tính chất này nhé.
Phân loại về tính đa hình (Polymorphism)
- Cùng mình nhắc lại một chút về tính đa hình: đây là tính chất cho phép
một phương thức có nhiều cách thể hiện khác nhau
ứng vớitừng đối tượng khác nhau
.
- Nghe định nghĩa có vẻ các bạn vẫn chưa hình dung rõ ràng được 🙃. Cùng mình phân tích tiếp để có cái nhìn chi tiết hơn về việc: khi nào là
đa hình theo Overriding
, khi nào làđa hình theo Overloading
nhé.
Overrding và Overloading được sử dụng ứng với method (function) trong class.
1. Overriding method
Overriding
cho phép class con định nghĩa lại phương thức đã có trong class cha.
Overriding là runtime polymorphism
csharp public class Animal
{ public virtual void Speak() { Console.WriteLine("Some generic animal sound"); }
} public class Dog : Animal
{ public override void Speak() { Console.WriteLine("Woof!"); }
} public class Cat : Animal
{ public override void Speak() { Console.WriteLine("Meow!"); }
}
- Ở trên là một ví dụ về
overriding method
. - Lớp
Animal
định nghĩa một method:Speak
với từ khóavirtual
cho phép ghi đề (override) ở class con. - 2 class con là
Dog
vàCat
đều kế thừa method:Speak
với từ khóaoverride
giúp phương thức được gọi chính xác trong quá trình thực thi (runtime).
csharp Animal myAnimal; myAnimal = new Dog();
myAnimal.Speak(); // In ra "Woof!" myAnimal = new Cat();
myAnimal.Speak(); // In ra "Meow!"
- Mặc dù myAnimal có kiểu Animal, nhưng nhờ
override
method, C# sẽ gọi đúng phương thức của class thực tế(Dog/Cat)
vào thời điểm runtime.
Điều kiện để xảy ra overriding method
:
- Chỉ xảy ra khi class con kế thừa class cha và cả 2 class có phương thức giống nhau hoàn toàn về:
tên, kiểu dữ liệu trả về và tham số truyền vào
. - Method trong class cha phải dùng từ khóa
virtual
- Method trong class con dùng từ khóa
override
2. Overloading method
Overloading
cho phép các method có tên giống nhau trong cùng một class.
Overloading là compile-time polymorphism.
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; }
}
- Ở trên là một ví dụ về
Overloading method
. - lớp
Calculator
có 3 method:Add
nhưng mỗi method có tham số hoặc kiểu trả về khác nhau.
csharp var calc = new Calculator(); Console.WriteLine(calc.Add(2, 3)); // Gọi int Add(int, int)
Console.WriteLine(calc.Add(2.5, 3.2)); // Gọi double Add(double, double)
Console.WriteLine(calc.Add(1, 2, 3)); // Gọi int Add(int, int, int)
- Khi C# biên dịch chương trình thì các phương thức này dù cùng tên gọi nhưng đã được phân biệt dựa trên danh sách tham số truyền vào và kiểu trả về.
Điều kiện để xảy ra Overloading method
:
- Các method có tên giống nhau được định nghĩa trong cùng một class.
- Các method này bắt buộc:
có kiểu dữ liệu trả về hoặc tham số truyền vào khác nhau
.
Kết luận
- Đa hình là một tính chất vô cùng quan trọng trong lập trình hướng đối tượng (OOP).
- Qua bài viết mình đã phân tích về 2 phân loại quan trọng của tính chất đa hình là:
Overriding và Overloading
. - Việc nắm rõ về kiến thức này, khi áp dụng vào trong thực tế thì sẽ giúp cho mã nguồn trở nên mềm mại, linh hoạt trong việc thay đổi nhưng bên cạnh đó vẫn giữ được tính tường minh, dễ hiểu, dễ mở rộng mà còn dễ dàng debug nữa 🤩.