Ответ 1
Поскольку вы реализуете интерфейс, полиморфизм, вероятно, вы хотите сохранить. Невозможно переопределить метод, не модифицируя базовый класс виртуальным, поэтому вы должны использовать новый вместо виртуального, как писал Тигран.
Это означает, что для написания этого типа кода будет выполняться только базовая версия метода:
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 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 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();