Can we change grand parent class's method definitions?
我正在研究一个问题,发现里面有个有趣的问题。
让我用一个例子来解释(C代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class A: IA { protected abstract void Append(LoggingEvent loggingEvent) { //Some definition } } public class B: A { protected override void Append(LoggingEvent loggingEvent) { //override definition } } public class MyClass: B { //Here I want to change the definition of Append method. } |
A类和B类属于某个库,我无法更改这些类。
由于层次结构中没有一个方法是
1 2 3 4 5 6 7 | public class MyClass: B { protected override void Append(LoggingEvent loggingEvent) { // New logic goes here... } } |
根据我的研究,我已经分享了下面的解决方案,但是根据我的理解,对您共享的代码做了一些后续的更改,因为问题中的代码在少数情况下是无效的。
删除了类A中append方法的主体,因为抽象方法不能有主体。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public interface IA { } public abstract class A : IA { protected abstract void Append(); } public class B : A { protected override void Append() { //override definition } } public class MyClass : B { //Here I want to change the definition of Append method. //You can do is hide the method by creating a new method with the same name public new void Append() { } } |
答:不能重写非虚拟方法。你能做的最接近的事情就是通过创建一个同名的新方法来隐藏这个方法,但是这是不可取的,因为它违反了良好的设计原则。但是,即使隐藏一个方法,也不会像真正的虚拟方法调用那样给您提供方法调用的执行时间多态分派。