由于您正在实现一个接口,因此您可能希望保留多态性。如果不使用 virtual 修改基类,就不可能覆盖该方法,因此您必须像 Tigran 所写的那样使用 new 而不是 virtual。
这意味着编写这种代码但只执行方法的基本版本:
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();
执行派生类的方法并在运行时绑定。这意味着您可以像这样编写我的初始示例的代码并执行正确的方法:
List<IMyInterface> aList = new List<IMyInterface>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (IMyInterface anItem in aList)
anItem.OnItemClicked();