Viết chồng phương thức (Overriding method)

Một phần của tài liệu Giáo trình lập trình windowns form với c net tập 1 TS lê trung hiếu, ths nguyễn thị minh thi (Trang 155 - 158)

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.

Một phần của tài liệu Giáo trình lập trình windowns form với c net tập 1 TS lê trung hiếu, ths nguyễn thị minh thi (Trang 155 - 158)

Tải bản đầy đủ (PDF)

(179 trang)