如何调用基类方法?

时间:2018-03-14 05:57:22

标签: c# oop

我们有以下代码:

  public class A
  {
    protected virtual void Method()
    {
      Console.Write("A");
    }
  }

  public class B : A
  {
    protected override void Method()
    {
      Console.Write("B");
    }
  }

  public class C : B
  {
    public void Some()
    {
      //How to call Method() from class A?
    }
  }

如何在C类的Method()方法中从A类调用Some()

我们假设A和B是来自库的类,我们无法更改它们。

解决方案:https://stackoverflow.com/a/438952/8081796

3 个答案:

答案 0 :(得分:2)

Method()会覆盖标记为虚拟和受保护的AB,调用它的唯一方法(当前格式)是public class B : A { protected override void Method() { base.Method(); Console.Write("B"); } } 以某种方式调用它/ p>

A

或直接从public class C : A { public void Some() { Method(); } } 派生

{{1}}

virtual (C# Reference) | Microsoft Docs

  

virtual关键字用于修改方法,属性,索引器或   事件声明并允许在派生中重写它   类。例如,任何类都可以覆盖此方法   继承它:

<强>此外

  

调用虚方法时,对象的运行时类型为   检查一个压倒一切的成员。最重要的成员   调用派生类,如果不是,则可以是原始成员   派生类已重写成员。

protected (C# Reference)

  

受保护的成员可以在其类和派生类中访问   实例

答案 1 :(得分:0)

如果您really希望Method A在此处被调用(不更改AB&#39; {{1 }},你必须在下面进行更改。

  1. Method班级Method的访问说明符从B更改为new

      

    override将覆盖基类方法。让override无法做到。

  2. newAB的访问说明符更改为Method而不是public

      protected protected成员A无法在C课程内访问。

  3. 通过此更改,请查看以下代码。您会看到来自班级Method的{​​{1}}被调用。

    A

    如果您无法进行上述更改,那么我担心您无法拨打static void Main() { var c = new C(); c.Some(); Console.ReadKey(); } public class A { public virtual void Method() { Console.Write("A"); } } public class B : A { public new void Method() { Console.Write("B"); } } public class C : B { public void Some() { //How to call Method() from class A? ((A)this).Method(); } } A:O。

答案 2 :(得分:0)

这是不可能的,因为

  

可以通过覆盖来更改虚拟成员的实现   派生类中的成员。

B更改了A的实施,因此CB实施base而未实施A

解决方案:https://stackoverflow.com/a/438952/8081796