Poiché si sta implementando un'interfaccia, il polimorfismo è probabilmente qualcosa che si desidera conservare. È impossibile sovrascrivere il metodo senza modificare la classe base con un virtuale, quindi è necessario utilizzare nuovo anziché virtuale come scritto da Tigran.
Ciò significa che scrivere questo tipo di codice, ma solo la versione base del metodo sarebbe eseguita:
List<MyClass> aList = new List<MyClass>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (MyClass anItem in aList)
anItem.OnItemClicked();
Per eseguire il codice giusto si dovrebbe scrivere brutto codice come questo:
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();
}
Ad ogni modo è possibile che le classi eseguano il metodo corretto quando vengono assegnate a variabili dichiarate come IMyInterface. La strada da percorrere è implementare esplicitamente la parte dell'interfaccia che si desidera sovrascrivere, nel caso specifico il metodo OnItemClicked.Il codice è il seguente:
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();
}
}
In questo modo:
MyClass cl = new MyNewClass();
cl.OnItemClicked();
esegue il metodo di base
MyNewClass cl = new MyNewClass();
cl.OnItemClicked();
esegue il metodo della classe derivata
IMyInterface cl = new MyNewClass();
cl.OnItemClicked();
esegue il metodo del deri ved classe ed è associato a runtime. Ciò significa che è possibile scrivere il codice del mio esempio iniziale in questo modo e avere i giusti metodi eseguiti:
List<IMyInterface> aList = new List<IMyInterface>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (IMyInterface anItem in aList)
anItem.OnItemClicked();
Creare una classe intermedia tra questi due. –