new
có nghĩa là tôn trọng loại TÀI LIỆU THAM KHẢO của bạn (phía bên trái =
), do đó chạy phương thức của loại tham chiếu. Nếu phương thức được xác định lại không có new
từ khóa, thì nó được xử lý như nó có. Hơn nữa, nó còn được gọi là di truyền không đa hình . Đó là, tôi đang tạo ra một phương thức hoàn toàn mới trong lớp dẫn xuất hoàn toàn không liên quan gì đến bất kỳ phương thức nào có cùng tên trong lớp cơ sở. - bởi Whitaker nói
override
, phải được sử dụng với virtual
từ khóa trong lớp cơ sở của nó, có nghĩa là tôn trọng loại ĐỐI TƯỢNG của bạn (phía bên phải =
), do đó chạy phương thức ghi đè lên bất kể loại tham chiếu nào. Hơn nữa, nó còn được gọi là di truyền đa hình .
Cách của tôi để ghi nhớ cả hai từ khóa mà chúng trái ngược nhau.
override
: virtual
từ khóa phải được xác định để ghi đè phương thức. Phương thức sử dụng override
từ khóa bất kể loại tham chiếu (tham chiếu của lớp cơ sở hoặc lớp dẫn xuất) nếu nó được khởi tạo với lớp cơ sở, phương thức của lớp cơ sở chạy. Mặt khác, phương thức của lớp dẫn xuất chạy.
new
: nếu từ khóa được sử dụng bởi một phương thức, không giống như override
từ khóa, loại tham chiếu rất quan trọng. Nếu nó được khởi tạo với lớp dẫn xuất và kiểu tham chiếu là lớp cơ sở, phương thức của lớp cơ sở chạy. Nếu nó được khởi tạo với lớp dẫn xuất và kiểu tham chiếu là lớp dẫn xuất, phương thức của lớp dẫn xuất chạy. Cụ thể, nó là sự tương phản của override
từ khóa. En passant, nếu bạn quên hoặc bỏ qua để thêm từ khóa mới vào phương thức, trình biên dịch sẽ hoạt động theo mặc định khi new
từ khóa được sử dụng.
class A
{
public string Foo()
{
return "A";
}
public virtual string Test()
{
return "base test";
}
}
class B: A
{
public new string Foo()
{
return "B";
}
}
class C: B
{
public string Foo()
{
return "C";
}
public override string Test() {
return "derived test";
}
}
Gọi chính:
A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());
Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());
Đầu ra:
A
B
B
base test
derived test
Ví dụ mã mới,
Chơi với mã bằng cách bình luận từng cái một.
class X
{
protected internal /*virtual*/ void Method()
{
WriteLine("X");
}
}
class Y : X
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Y");
}
}
class Z : Y
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Z");
}
}
class Programxyz
{
private static void Main(string[] args)
{
X v = new Z();
//Y v = new Z();
//Z v = new Z();
v.Method();
}