由於您正在實現一個接口,多態可能是您想要保留的東西。如果不用虛擬基礎類來調用方法是不可能的,所以你必須使用新的而不是虛擬的,就像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();
創建這兩個之間的中間階級。 –