我们可以更改父级父类的方法定义吗?

时间:2018-07-06 10:43:29

标签: c# oop inheritance polymorphism method-overriding

我正在研究某个问题,并在内部发现了一些有趣的问题。

让我用示例(C#代码)进行解释

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

2 个答案:

答案 0 :(得分:1)

由于此处的层次结构中没有一个方法是sealed,因此您可以继续自己重写该方法:

public class MyClass: B
{
    protected override void Append(LoggingEvent loggingEvent)
    { 
          // New logic goes here...
    }
}

答案 1 :(得分:-1)

根据我的研究,我已经共享了以下解决方案,但是根据我的见解,对共享代码进行了以下更改,因为问题中的代码在少数情况下是无效的。

  1. 添加了一个空接口IA,因为A类未实现任何 public 方法。
  2. 将A类定义为抽象类,因为任何非抽象类都不能定义抽象方法。
  3. 删除了A类内Append方法的主体,因为抽象方法不能具有主体。

    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() { }
    }
    

答案:您不能覆盖非虚拟方法。您可以做的最接近的事情是通过创建一个具有相同名称的新方法来隐藏该方法,但这是不可取的,因为它违反了良好的设计原则。 但是,即使隐藏方法也不会像真正的虚拟方法调用那样为您带来执行时间上方法调用的多态调度。