Phương thức đa hình

Một phần của tài liệu Lập trình hướng đối tượng với C docx (Trang 90 - 94)

Để xây dựng một phương thức hỗ trợ tính đa hình, ta đặt từ khóa

virtual trong phương thức của lớp cơ sở. Ví dụ, để chỉ định rằng phương thức H ienThi() của lớp DongVat trong ví dụ dưới đây là đa hình, đơn giản là ta thêm từ khóa virtual vào khai báo trong phương thức như sau:

public virtual void HienThi()

{

chan, moitruong);

}

Lúc này thì các lớp dẫn xuất được tự do thực thi các cách xử lý riêng của mình trong phiên bản mới của phương thức HienThi(). Để làm được điều này chỉ cần thêm từ khóa override để chồng lên phương thức ảo HienThi () của lớp cơ sở. Sau đó thêm các đoạn mã nguồn mới vào phương thức viết chồng này.

Trong ví dụ minh họa sau, lớp ConMeo dẫn xụất từ lớp DongVat và thực thi một phiên bản riêng của phương thức HienThi():

public override void HienThi()

{

base.HienThi();

Console.WriteLine("con vat ma toi yeu thich la con {0} co {1}

chan,thich an {2}", ten, chan, moitruong);

}

Từ khóa override bảo với trình biên dịch rằng lớp này thực hiện việc phủ quyết lại phương thức HienThi() của lớp cơ sở. Tương tự như vậy ta có thể thực hiện việc phủ quyết phương thức này trong một lớp dẫn xuất khác mà được dẫn xuất từ lớp D o n g V a t

Ví dụ: Xây dựng phương thức ảo trong lớp cơ sở, và ghi đè phương thức ảo trong lớp kế thừa using System; using System.Collections.Generic; using System.Text; namespace vidu { class Program {

static void Main(string[] args) {

DongVat dongVat1 = new DongVat("ga", 2, "can"); ConMeo conmeo1 = new ConMeo("meo", 4, "can"); Console.WriteLine("ket qua cua lop dong vat"); dongVat1.HienThi();

Console.WriteLine("ket qua cua lop con meo "); conmeo1.HienThi();

Console.ReadLine(); }

}

public class DongVat {

protected string ten; protected int chan;

protected string moitruong;

public DongVat(string ten, int chan, string moitruong) {

this.ten = ten; this.chan = chan;

this.moitruong = moitruong; }

//phuong thuc duoc khai bao la ao public virtual void HienThi() {

Console.WriteLine("con {0} co {1} chan ,song o moi truong {2}", ten, chan, moitruong);

} }

public class ConMeo : DongVat {

public ConMeo(string ten, int chan, string moitruong) : base(ten, chan, moitruong)

{ }

//phu quyet phuong thuc HienThi cua lop co so public override void HienThi()

{

base.HienThi();

Console.WriteLine("con vat ma toi yeu thich la con {0} co {1} chan,thich an {2}", ten, chan, moitruong);

} }

Đoạn chương trình trên chúng ta thấy tính đa hình chưa được thể hiện trong chương trình Main. Tính đa hình sẽ được thể hiện rõ trong trường hợp như sau:

DongVat[] dv = new DongVat[2];

dv[0] = new DongVat("Cho", 4, "Vat nuoi can");

dv[1] = new ConMeo("Meo muop", 4, "Vat nuoi can");

dv[0].HienThi();

dv[1].HienThi();

Khi thực hiện đoạn chương trình trên trình biên dịch biết rằng mảng có hai đối tượng DongVat và phải thực hiện thực thi phương thức HienThi cho các đối tượng này. Nếu chúng ta không đánh dấu phương thức HienThi trong lớp DongVat là virtual thì phương thức HienThi của lớp DongVat sẽ được gọi 2 lần. Tuy nhiên do chúng ta đã đánh dấu phương thức HienThi ở lớp cơ sở là phương thức ảo và thực thi phủ quyết ở lớp dẫn xuất

Khi ta gọi phương thức HienThi trong mảng, trình biên dịch sẽ dò ra được chính xác kiểu dữ liệu nào được thực thi trong mảng khi đó có hai kiểu sẽ được thực thi là một DongVat, một ConMeo. Và trình biên dịch sẽ gọi chính xác phương thức của từng đối tượng.

Ta thấy rằng mảng dv được khai báo là đối tượng lớp DongVat. Nhưng khi nhận giá trị thì dv[0] được gán cho một đối tượng lớp DongVat, dv[1] được gán cho một đối tượng lớp ConMeo. Như vậy phương thức dv[0].HienThi() thì sẽ thực thi phương thức HienThi của lớp DongVat, còng dv[1].HienThi() thì sẽ thực thi phương thức HienThi của lớp ConMeo. Ta thấy dv[0] và dv[1] là hai loại khác nhau nhưng lại có cùng một

cách thức thực hiện phương thức HienThi() là như nhau đây chính là thể hiện tính đa hình.

Lưu ý: Nếu phương thức của lớp cơ sở là phương thức ảo, ta có thể phủ quyết lớp ảo ở lớp dẫn xuất băng từ khóa override, hoặc không phủ quyết phương thức ảo, khi đó phương thức ảo ở lớp cơ sở trở thành phương thức ảo ở lớp dẫn xuất.

Một phần của tài liệu Lập trình hướng đối tượng với C docx (Trang 90 - 94)

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

(142 trang)