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