Overriding là khi bạn cung cấp một override
thực hiện mới của một phương pháp trong một lớp hậu duệ khi phương pháp mà được định nghĩa trong lớp cơ sở như virtual
.
Ẩn là khi bạn cung cấp một thực hiện mới của một phương pháp trong một lớp hậu duệ khi phương pháp đó là không được định nghĩa trong lớp cơ sở như virtual
, hoặc khi thực hiện mới của bạn không xác định override
.
Ẩn thường rất tệ; bạn thường nên cố gắng không làm điều đó nếu bạn có thể tránh được nó. Ẩn có thể gây ra những điều bất ngờ xảy ra, bởi vì các phương thức ẩn chỉ được sử dụng khi được gọi trên một biến kiểu thực mà bạn đã định nghĩa, không phải nếu sử dụng tham chiếu lớp cơ sở ... mặt khác, các phương thức ảo bị ghi đè sẽ kết thúc bằng phiên bản phương thức thích hợp được gọi, ngay cả khi được gọi bằng cách sử dụng tham chiếu lớp cơ sở trên lớp con.
Ví dụ, hãy xem xét các lớp:
public class BaseClass
{
public virtual void Method1() //Virtual method
{
Console.WriteLine("Running BaseClass Method1");
}
public void Method2() //Not a virtual method
{
Console.WriteLine("Running BaseClass Method2");
}
}
public class InheritedClass : BaseClass
{
public override void Method1() //Overriding the base virtual method.
{
Console.WriteLine("Running InheritedClass Method1");
}
public new void Method2() //Can't override the base method; must 'new' it.
{
Console.WriteLine("Running InheritedClass Method2");
}
}
Hãy gọi nó là như thế này, với một thể hiện của InheritedClass, trong một tài liệu tham khảo phù hợp:
InheritedClass inherited = new InheritedClass();
inherited.Method1();
inherited.Method2();
này trả về những gì bạn nên mong đợi; cả hai phương pháp đều nói rằng họ đang chạy phiên bản InheritedClass.
Chạy InheritedClass Method1
Chạy InheritedClass Method2
Mã này tạo ra một thể hiện của cùng một, InheritedClass, nhưng lưu nó trong một tham chiếu BaseClass:
BaseClass baseRef = new InheritedClass();
baseRef.Method1();
baseRef.Method2();
Thông thường, dưới OOP nguyên tắc, bạn nên mong đợi cùng một đầu ra như ví dụ trên. Nhưng bạn không nhận được cùng một kết quả:
Chạy InheritedClass Method1
Chạy BaseClass Method2
Khi bạn viết mã InheritedClass, bạn có thể đã muốn tất cả các cuộc gọi đến Method2()
để chạy mã bạn đã viết trong đó. Thông thường, đây sẽ là cách nó hoạt động - giả sử bạn đang làm việc với phương thức virtual
mà bạn đã ghi đè.Nhưng vì bạn đang sử dụng phương thức ẩn là new
, nên thay vào đó, nó gọi phiên bản trên tham chiếu bạn đang sử dụng.
Nếu đó là hành vi bạn thực sự muốn, sau đó; có bạn đi. Nhưng tôi mạnh mẽ đề nghị rằng nếu đó là những gì bạn muốn, có thể có một vấn đề kiến trúc lớn hơn với mã.
sau khi đi qua google tôi đã ở đây với các vấn đề của tôi ... – NoviceToDotNet
Có vẻ như bạn cần phải học các khái niệm lập trình C# cơ bản, trước khi bạn có thể hiểu được phương pháp ghi đè và ẩn. Hãy thử một trong rất nhiều C# cuốn sách mới bắt đầu xung quanh. – thecoop
1) a.m1(); // điều này sẽ in và tại sao? Đơn giản là nó sẽ in ''hai thành tất cả' 'bởi vì bạn đang sử dụng khái niệm ghi đè phương pháp. 2) b = a; // chuyện gì xảy ra ở đây thế? Ở đây chúng ta sẽ nhận được một lỗi biên dịch vì đối tượng lớp con sẽ không tham chiếu đến đối tượng lớp cơ sở. Và ngược lại là có thể theo khái niệm Thừa kế. – Krish