Trong phõn cấp lớp, khi một phương thức của lớp con cú cựng tờn, và giống nhau về số lượng và kiểu tham đối cũng như kiểu trả về
với một phương thức ở lớp cha, thỡ phương thức ở lớp con được gọi là viết chồng (override) hay che khuất (hide) phương thức kế thừa từ
lớp cha.
Khỏc với C++ và Java, trong C# cỏc phương thức trong một đối tượng mặc định khụng được viết chồng. Bằng cỏch khai bỏo virtual cho một phương thức của lớp cơ sở, sẽ cho phộp phương thức đú được viết chồng trong bất kỳ lớp con nào. Và cỏc phương thức viết
chồng phương thức virtual phải được khai bỏo override. Bạn khụng
thể khai bỏo virtual cho phương thức tĩnh. Khai bỏo override cú thể
sử dụng cho phương thức ảo (virtual method) và phải sử dụng cho phương thức trừu tượng (abstract method).
public class MyBaseClass {
public virtual void VirtualMethod() { } }
public class MyDerivedClass : MyBaseClass {
//Viết chồng phương thức
public override void VirtualMethod () { } }
Nếu một phương thức ở lớp con cú cựng khai bỏo phương thức ở lớp cơ sở nhưng khụng viết chồng (override) cú nghĩa là phương
thức lớp con che khuất (hide) phương thức kế thừa từ lớp cơ sở.
Trong hầu hết mọi trường hợp viết chồng một phương thức hơn là che
khuất nú. Nếu tạo ra hai phương thức cú cựng khai bỏo ở cả lớp con
và lớp cơ sở mà khụng cú khai bỏo override thỡ sẽ bị cảnh bỏo trong
khi biờn dịch. Trong C#, nờn sử dụng từ khoỏ new để đảm bảo muốn
che khuất phương thức đú.
public class MyBaseClass {
public void Method() { } }
public class MyDerivedClass : MyBaseClass {
//Nếu che khuất phương thức ở lớp cơ sở, khai bỏo new
public new void Method () { } }
Xột vớ dụ sau, bạn sẽ thấy sự khỏc nhau của khai bỏo new hay override cho phương thức của lớp con:
Vớ dụ: using System; namespace QLNV { class NhanVien {
protected string HoTen; protected int NamSinh;
public NhanVien(string HoTen, int NamSinh) {
this.HoTen = HoTen; this.NamSinh = NamSinh; }
public virtual void HienThi() {
Console.WriteLine("Ho ten la:{0}", HoTen); Console.WriteLine("Nam sinh la:{0}", NamSinh); }
}
class NVBienChe:NhanVien {
float HeSoLuong;
public NVBienChe(string HoTen, int NamSinh, float HeSoLuong) {
this.HoTen = HoTen; this.NamSinh = NamSinh; this.HeSoLuong = HeSoLuong; }
public override void HienThi() {
Console.WriteLine("Ho ten la:{0}", HoTen); Console.WriteLine("Nam sinh la:{0}", NamSinh); Console.WriteLine("He so luong la:{0}", HeSoLuong);
}
public static void Main() {
NhanVien NV;
NV = new NhanVien("Nguyen Thi Hoa", 1980);
NV.HienThi(); //Gọi phương thức HienThi() của lớp cơ sở
NV = new NVBienChe("Nguyen Thi Hoa", 1980, 1.96F); NV.HienThi(); //Gọi phương thức HienThi() của lớp con
} } }
Nếu bạn khai bỏo new cho phương thức HienThi(), cả 2 dũng lệnh gọi phương thức HienThi() trờn đều gọi phương thức HienThi() của lớp cơ sở.
Việc khai bỏo từ khúa override cho phương thức của lớp con, sẽ
nhõn viờn hợp đồng. Và tựy thuộc nhõn viờn là biờn chế hay hợp đồng, phương thức HienThi() tương ứng của lớp con NVBienChe hay NVHopDong sẽ được gọi.