C # - gọi phiên bản cơ sở của phương thức ghi đè


8

Giả sử có lớp cơ sở Avà lớp dẫn xuất B.

Lớp Acó hai chức năng: fun1()fun2(), trong đó fun1()các cuộc gọi fun2().

Lớp Bghi đè fun1()fun2(), và một lần nữa fun1()gọi fun2().

Tuy nhiên, tôi muốn gọi base.fun1()overriden fun2(). Vì base.fun1()các cuộc gọi fun2()thay vì phiên bản của lớp cơ sở tạo ra vòng lặp khá đáng tiếc:

fun1() -> fun2() -> base.fun1() -> fun2() -> base.fun1() -> ...

Có cách nào để buộc base.fun1()phải gọi phiên bản cơ sở của fun2()? Tôi biết rằng vấn đề thực sự có lẽ nằm ở thiết kế tồi của các lớp đó, nhưng tôi vẫn tò mò liệu điều đó có thể xảy ra hay không.


Các chức năng đó thực hiện một số nội dung khác nhau ngoài việc gọi cho nhau mà không thực sự quan trọng trong câu hỏi này. Tôi không tìm kiếm sự giúp đỡ với mã rất cụ thể có thể được viết lại theo nhiều cách tốt hơn. Trong ví dụ này tôi sẽ thấy nó theo cách này : fun1() -> fun2() -> base.fun1() -> base.fun2(). Thật không may, sau khi ghi đè base.fun2(), các base.fun1()cuộc gọi fun2()thay thế.
Maras

Câu trả lời:


4

Sử dụng phương pháp ẩn.

Phương pháp ẩn còn được gọi là bóng. Phương thức của lớp cha có sẵn cho lớp con mà không sử dụng từ khóa ghi đè trong bóng. Lớp con có phiên bản riêng của cùng chức năng. Sử dụng từ khóa mới để thực hiện đổ bóng.

public class A
{
    public virtual void Func1() { Func2(); }

    public virtual void Func2() { Console.WriteLine("A: Func2"); }
}

public class B : A
{
    public override void Func1() { Func2(); }

    public new void Func2() { base.Func1(); }
}

4
@Mara: Hai điều (1) bạn có thể muốn làm cho Func2không ảo Avà (2) sử dụng hết sức thận trọng với mẫu này. Nó có thể rất khó hiểu với những người dùng ngây thơ mong đợi công văn ảo sẽ nhận được công văn tĩnh.
Eric Lippert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.