【问题标题】:How to call a specific overridden method in C#?如何在 C# 中调用特定的重写方法?
【发布时间】:2015-08-24 10:41:47
【问题描述】:

我有一个“修改”方法在继承类时被多次覆盖,该类接受一个 int 并有一个开关来决定如何处理它。

如果方法不知道 int,则将其传递给继承类的版本。

现在,在某些情况下,不同的覆盖可能对相同的 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;
    }
  }

我的问题:给定一个类 C 的实例,我如何访问被 C 覆盖的特定方法而不通过“基”引用它?

【问题讨论】:

  • 你不能指定调用哪个父方法。你只能在你的方法中加入条件来实现这一点。但是我不确定你为什么需要这个。
  • 你不能吗? :C objC = new C(); objC.Modify(10);
  • “我如何访问被 C 覆盖的特定方法”是什么意思?您持有哪种类型的实例?基地的?
  • 我持有一个类型为 A 的 C 实例。A myObject = new C();

标签: c# overriding


【解决方案1】:

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

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

objectC1 的作用与objectC2 相同。他们都打电话给C.Modify(int)

【讨论】:

  • 哦,好吧。感谢您的回答。看来我必须以不同的方式处理这个问题。
【解决方案2】:

简单的答案是你不能。您需要进行非虚拟方法调用,但 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());
}

这应该返回 1。但我想认为这个问题可能有更优雅的解决方案。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多