Phương thức ảo và đa hình

Một phần của tài liệu lập trình hướng đối tượng c# (Trang 30 - 34)

Những trường thành viên(member fields) và những hàm tĩnh thì không được khai báo Virtual.

- Nếu một phương thức có cùng đặc tính trong cả hai khai báo ở lớp cơ sở và lớp thừa hưởng nhưng các phương thức này thì không khai báo virtual hay overriden thì sẽ được gọi là: "lớp thừa hưởng hide lớp cơ sở đó". Kết quả là: phương thức nào được gọi phụ thuộc vào kiểu của biến được sử dụng để tham khảo đến thể hiện, chứ không phải kiểu của chính thể hiện đó.

- Trong hầu hết mọi trường hợp bạn luôn thích override một phương thức hơn là hide nó. Bởi vì hide dễ gây ra những lỗi nghiêm trọng. Nhưng cú pháp C# được thiết kế để bảo đảm cho những nhà phát triển sẽ được cảnh báo trong thời gian biên dịch về vấn đề nghiêm trọng này.

- Nếu bạn tạo ra hai phương thức hoàn toàn giống nhau ở cả lớp thừa hưởng và lớp cơ sở mà không có khai báo virtual và override thì bạn sẽ bị cảnh báo trong khi biên dịch. Trong C#, bạn nên sử dụng từ khoá new để đảm bảo bạn muốn hide phương thức đó. Gọi các phiên bản cơ sở của các chức năng(base Versions of Functions):

- Trong C# có một cú pháp đặc biệt để gọi những phiên bản cơ sở của một phương thức từ một lớp thừa hưởng. Cú pháp : base.<methodname>().

Phương thức trong lớp cha: C# hỗ trợ từ khóa "base" cho việc gọi lại các phương thức của lớp cha. Hàm nạp chồng (overload) được khai báo 1 cách tường minh bằng từ khóa "override"

- Phương thức ảo là cách thu được từ tính đa hình. - xét Phương thức ảo using System; using System.Collections.Generic; using System.Text; namespace vidu3 { class Program {

static void Main(string[] args) {

DongVat dongVat1 = new DongVat("ga", 2, "can"); ConMeo conmeo1 = new ConMeo("meo", 4, "can"); CayXanh cayTao = new CayXanh("tao", 0, "can", "qua tao");

Console.WriteLine("ket qua cua lop dong vat"); dongVat1.HienThi();

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

Console.WriteLine("Ket qua cua lop cay xanh"); cayTao.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) {

} (adsbygoogle = window.adsbygoogle || []).push({});

//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);

} }

public class CayXanh : DongVat

{

//bien cua class cayxanh

private string qua;

public CayXanh(string ten, int chan, string moitruong, string thayDoi)

: base(ten, chan, moitruong) {

qua = thayDoi; }

//thuc hien phu quyet phuong thuc hienthi()

public override void HienThi()

{

base.HienThi();

Console.WriteLine("co su thay doi o day la : {0}", qua); }

} } t ạ i đ ây

Ban đầu ta xây dựng phương thức được khai báo là ảo:

public virtual void HienThi()

{

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

}

thực hiện phủ quyết phương thức HienThi() trong 2 class sau: - Phương thức không có tham số

//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); (adsbygoogle = window.adsbygoogle || []).push({});

}

Phương thức có tham số truyền vào hàm khởi dựng

//thuc hien phu quyet phuong thuc hienthi()

public override void HienThi()

{

base.HienThi();

Console.WriteLine("co su thay doi o day la : {0}",qua); }

Một phần của tài liệu lập trình hướng đối tượng c# (Trang 30 - 34)