Không, bạn không thể ghi đè phương thức không phải ảo. Điều gần nhất bạn có thể làm là ẩn phương thức bằng cách tạo phương thức new
có cùng tên nhưng điều này không được khuyến khích vì nó phá vỡ nguyên tắc thiết kế tốt.
Nhưng thậm chí ẩn một phương thức sẽ không cung cấp cho bạn thời gian thực hiện gửi đa hình các cuộc gọi phương thức như cuộc gọi phương thức ảo thực sự. Hãy xem xét ví dụ này:
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
Trong ví dụ này cả hai gọi tới phương thức M
in Foo.M
. Như bạn có thể thấy cách tiếp cận này cho phép bạn có một triển khai mới cho một phương thức miễn là tham chiếu đến đối tượng đó thuộc loại có nguồn gốc chính xác nhưng ẩn phương thức cơ sở thì đa hình phá vỡ.
Tôi khuyên bạn không nên ẩn các phương thức cơ sở theo cách này.
Tôi có xu hướng phụ thuộc vào những người ủng hộ hành vi mặc định của C# rằng các phương thức không phải là ảo theo mặc định (ngược với Java). Tôi sẽ đi xa hơn và nói rằng các lớp học cũng nên được niêm phong theo mặc định. Thừa kế là khó để thiết kế cho đúng và thực tế là có một phương pháp mà không được đánh dấu là ảo chỉ ra rằng tác giả của phương pháp đó không bao giờ có ý định cho phương pháp được ghi đè.
Chỉnh sửa: "thời gian thực hiện đa hình văn":
Những gì tôi có ý nghĩa bởi đây là hành vi mặc định điều đó xảy ra vào thời điểm thực hiện khi bạn gọi phương pháp ảo. Ví dụ, trong ví dụ mã trước của tôi, thay vì định nghĩa một phương thức không phải ảo, thực tế tôi đã định nghĩa một phương thức ảo và một phương thức ghi đè thực sự.
Nếu tôi được gọi b.Foo
trong trường hợp đó, CLR sẽ xác định một cách chính xác các loại đối tượng mà b
điểm tham chiếu đến như Bar
và sẽ cử các cuộc gọi đến M
một cách thích hợp.
Nguồn
2009-12-05 23:48:52
Bạn có nghĩa là * quá tải * hoặc * ghi đè * không? Quá tải = thêm phương thức có cùng tên nhưng các thông số khác nhau (ví dụ: các quá tải khác nhau của Console.WriteLine). Ghi đè = (gần) thay đổi hành vi mặc định của phương thức (ví dụ: phương thức Shape.Draw có hành vi khác nhau cho Vòng kết nối, Hình chữ nhật, v.v.). Bạn luôn có thể * quá tải * một phương thức trong lớp dẫn xuất, nhưng * ghi đè * chỉ áp dụng cho các phương thức ảo. – itowlson