Ví dụ thứ hai mà bạn đã hiển thị ẩn GetData của phụ huynh, nó không ghi đè lên nó.
Ví dụ:
private class Base
{
public virtual void Test()
{
Console.WriteLine("Base");
}
public void Test2()
{
Console.WriteLine("Base");
}
}
private class Derived : Base
{
public override void Test()
{
Console.WriteLine("Derived");
}
public void Test2()
{
Console.WriteLine("Derived");
}
}
static void Main()
{
Base b = new Base();
Derived d = new Derived();
Base dInB = new Derived();
b.Test();
d.Test();
dInB.Test();
b.Test2();
d.Test2();
dInB.Test2();
Console.ReadKey(true);
}
Nó ra:
Base // Base.Test()
Derived // Derived.Test()
Derived // Derived.Test()
Base // Base.Test2()
Derived // Derived.Test2()
Base // You think you're calling Derived.Test2(), but you actually call Base.Test2()
Trên thực tế mẫu này là không hợp lệ, vì nó nên sử dụng từ khóa new
trong public new void Test2()
trong lớp Derived.
Nó hoạt động giống như quá tải toán tử. Nó không thực sự ghi đè lên bất cứ điều gì. Khi bạn có chính xác loại Derived
, nó gọi phương thức mới.
Bạn phải thực sự cẩn thận với việc ẩn thành viên, không có gì giống như ghi đè (lớp) hoặc triển khai (giao diện) chút nào.Chỉ khi bạn cóchính xác, nó sẽ gọi phương thứcnew
, nếu không nó sẽ vẫn gọi phương thức kiểu cơ sở!
Bạn có thấy dấu gạch dưới B.GetData() không? Bạn có thấy cảnh báo trong Danh sách Xem + Lỗi không? Rất khó bỏ lỡ, hãy sử dụng từ khóa * mới * khi bạn biết mình đang làm gì. –
Trong ví dụ đầu tiên, phương thức B không thể là riêng tư. Nó sẽ không biên dịch. – TrueWill