由于您正在实现一个接口,多态可能是您想要保留的东西。如果不用虚拟基础类来调用方法是不可能的,所以你必须使用新的而不是虚拟的,就像Tigran写的那样。
这意味着,写这种代码,但只有方法的基础版本将被执行:
List<MyClass> aList = new List<MyClass>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (MyClass anItem in aList)
anItem.OnItemClicked();
要执行正确的代码,你应该写丑陋的代码是这样的:
List<MyClass> aList = new List<MyClass>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (MyClass anItem in aList)
{
MyNewClass castItem = anItem as MyNewClass;
if (castItem != null)
castItem.OnItemClicked();
else
anItem.OnItemClicked();
}
无论如何,有一种方法可以让您的类在分配给声明为IMyInterface的变量时执行正确的方法。要走的路是明确地实现你想重写的接口部分,在你的情况下是OnItemClicked方法。该代码是下面的:
public class MyNewClass : MyClass, IMyInterface // you MUST explicitly say that your class implements the interface, even if it's derived from MyClass
{
public new void OnItemClicked() //NEW keyword here you have the overridden stuff
{
/*...*/
}
void IMyInterface.OnItemClicked() // No need for public here (all interfaces's methods must be public)
{
this.OnItemClicked();
}
}
以这种方式:
MyClass cl = new MyNewClass();
cl.OnItemClicked();
执行基方法
MyNewClass cl = new MyNewClass();
cl.OnItemClicked();
执行派生类的方法
IMyInterface cl = new MyNewClass();
cl.OnItemClicked();
执行派生的方法ved类并在运行时绑定。这意味着,你可以写我喜欢这个最初的例子的代码,并且执行正确的方法:
List<IMyInterface> aList = new List<IMyInterface>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (IMyInterface anItem in aList)
anItem.OnItemClicked();
创建这两个之间的中间阶级。 –