如何在 C# 中调用特定的重写方法?

How to call a specific overridden method in C#?

我有一个 'Modify' 方法在继承 classes 时被多次覆盖,它接受一个 int 并有一个开关来决定如何处理它。

如果该方法不知道该 int,它会被传递给继承的 class' 版本。

现在,在某些情况下,对于同一个 int,不同的覆盖可能有不同的情况(参见情况 10)。

public abstract class A
{
  public virtual void Modify(int i)
  {
    switch(i)
    {
      //switch cases
    }
  }
}

public abstract class B : A
{
  public override void Modify(int i)
  {
    switch (i)
    {
      //switch cases
      case 10:
        //Under certain circumstances, this case should be used
        break;
      default:
        base.Modify(i);
        break;
    }
  }
}

public class C : B
{
  public override void Modify(int i)
  {
    switch (i)
    {
      //switch cases
      case 10:
        //By default, this case should be used
        break;
      default:
        base.Modify(i);
        break;
    }
  }

我的问题:给定一个 class C 的实例,我如何在不通过 'base' 引用它的情况下访问被 C 覆盖的特定方法?

你不能那样做。如果您确实需要这样做,那么您的应用程序设计有误。

简单的回答是你不能。您需要执行非虚拟方法调用,但 C# 根本不会为 类.

执行此操作

如果您尝试转换对象,您将以递归方法调用结束。

不过还是有办法的,虽然有点不爽。你想要的是像调用虚拟方法一样调用非虚拟方法,这可以通过动态调度来实现。

public class A
{
    public int Modify()
    {
        return 1;
    }
}

public class B : A
{
    public new int Modify()
    {
        return 2;
    }
}

public class C : B
{
    public new int Modify()
    {
        return ((A)this).Modify();
    }
}


public void Main()
{
    dynamic obj = new C();
    Conosle.WriteLine(c.Modify());
}

这应该return1。但是我想这个问题可能有更优雅的解决方案。

如果你的对象是Class C的一个实例,不管你是放在A还是C,它都会调用C的Modify函数Class:

C objectC1 = new C();
A objectC2 = new C();

objectC1 和 objectC2 一样。他们都称 C.Modify(int)