如何在 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)
我有一个 '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)