Tôi nghĩ ví dụ của ArsenMkrt không hoàn toàn chính xác, ít nhất nó không giải thích đầy đủ tính năng ẩn. Bằng cách thả các từ khóa mới từ phương pháp Foo trong lớp B, bạn vẫn sẽ nhận được đầu ra
A::Foo()
B::Foo()
A::Foo()
Trong một ngôn ngữ lập trình như Java, nơi mà tất cả các phương pháp là "ảo", mà bạn mong đợi để nhận được đầu ra
A::Foo()
B::Foo()
B::Foo()
bằng cách tham gia đang ArsenMkrt của trên, do instantiation
A a;
B b;
a = new A();
b = new B();
a.Foo();
b.Foo();
a = new B(); //<< Here
a.Foo();
trong ví dụ của mình tuy nhiên, bạn vẫn nhận được "A :: Foo()" bởi vì trong C# phương pháp này không ảo theo mặc định và S o phương thức B :: Foo() tự động ẩn Foo của A(). Để đạt được các hành vi đa hình người ta phải viết nó như sau thay vì:.
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public override void Foo() { Console.WriteLine("B::Foo()"); }
}
Bây giờ là nơi "mới" từ khóa đi kèm trong thực tế khi bạn rời khỏi "override" từ B :: Foo(), sau đó bạn một lần nữa sẽ ẩn A :: Foo() có nghĩa là bạn không ghi đè lên hành vi mặc định của nó và bạn không đạt được đa hình, tức là bạn có được "A :: Foo()" một lần nữa như đầu ra. Điều tương tự cũng có thể đạt được - và đây là nơi tôi không hiểu 100% lý do tại sao bạn phải đặt nó - bằng cách đặt từ khóa "mới" như ..
class A
{
public virtual void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public new void Foo() { Console.WriteLine("B::Foo()"); }
}
và bạn lại nhận được đầu ra
A::Foo()
B::Foo()
A::Foo()
Bạn có ý nghĩa gì với "ví dụ hợp lệ"? Một ví dụ đơn giản là cú pháp chính xác, hoặc một ví dụ cho thấy các phương pháp hay nhất để ẩn phương pháp? –