关于C#:我们可以更改父类的方法定义吗?

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类属于某个库,我无法更改这些类。


由于层次结构中没有一个方法是sealed,您可以继续自己覆盖该方法:

1
2
3
4
5
6
7
public class MyClass: B
{
    protected override void Append(LoggingEvent loggingEvent)
    {
          // New logic goes here...
    }
}

根据我的研究,我已经分享了下面的解决方案,但是根据我的理解,对您共享的代码做了一些后续的更改,因为问题中的代码在少数情况下是无效的。

  • 添加了一个空接口IA,因为类A没有实现任何公共方法。
  • 将类A定义为抽象类,因为任何非抽象类都不能定义抽象方法。
  • 删除了类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() { }
    }
  • 答:不能重写非虚拟方法。你能做的最接近的事情就是通过创建一个同名的新方法来隐藏这个方法,但是这是不可取的,因为它违反了良好的设计原则。但是,即使隐藏一个方法,也不会像真正的虚拟方法调用那样给您提供方法调用的执行时间多态分派。