Chủ yếu là một nhà phát triển Java, tôi đã hơi ngạc nhiên bởi kết quả khi tôi một ngày vô tình sử dụng mới từ khóa thay vì ghi đè.Trường hợp sử dụng cho C# cho phép sử dụng mới trên một phương thức ảo là gì?
Có vẻ như từ khóa mới loại bỏ "độ ảo" của phương thức ở cấp đó trong cây thừa kế, để gọi phương thức trên thể hiện lớp con bị downcasted vào lớp cha, sẽ không giải quyết để triển khai phương thức trong lớp con.
Trường hợp sử dụng thực tế cho hành vi này là gì?
Làm rõ: Tôi hiểu việc sử dụng mới khi cha mẹ không phải là ảo. Tôi tò mò hơn tại sao trình biên dịch cho phép kết hợp mới và ảo.
Ví dụ sau minh họa sự khác biệt:
using System;
public class FooBar
{
public virtual void AAA()
{
Console.WriteLine("FooBar:AAA");
}
public virtual void CCC()
{
Console.WriteLine("FooBar:CCC");
}
}
public class Bar : FooBar
{
public new void AAA()
{
Console.WriteLine("Bar:AAA");
}
public override void CCC()
{
Console.WriteLine("Bar:CCC");
}
}
public class TestClass
{
public static void Main()
{
FooBar a = new Bar();
Bar b = new Bar();
Console.WriteLine("Calling FooBar:AAA");
a.AAA();
Console.WriteLine("Calling FooBar:CCC");
a.CCC();
Console.WriteLine("Calling Bar:AAA");
b.AAA();
Console.WriteLine("Calling Bar:CCC");
b.CCC();
Console.ReadLine();
}
}
này tạo ra kết quả như sau:
Calling FooBar:AAA
FooBar:AAA
Calling FooBar:CCC
Bar:CCC
Calling Bar:AAA
Bar:AAA
Calling Bar:CCC
Bar:CCC
Ví dụ hay. Đó là một lựa chọn rất thuận tiện, nhưng tôi cho rằng nó có đủ cạm bẫy để đảm bảo một cảnh báo biên dịch. – PeterR
Bạn sẽ nhận được cảnh báo biên dịch nếu bạn không * có 'mới' nhưng bạn đang ẩn một phương thức. Ý tưởng là nếu bạn * rõ ràng * thêm một công cụ sửa đổi, đó phải là một dấu hiệu cho thấy bạn thực sự có ý nghĩa đó :) –