インターフェイスを実装しているので、多態性はおそらくあなたが保持したいものです。基本クラスを仮想で修正せずにメソッドをオーバーライドすることは不可能です。したがって、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();
実行を実行する実行しますデリの方法実行時にバインドされます。これは、私の最初の例のコードを次のように記述し、適切なメソッドを実行できることを意味します。
List<IMyInterface> aList = new List<IMyInterface>();
aList.Add(new MyClass());
aList.Add(new MyNewClass());
foreach (IMyInterface anItem in aList)
anItem.OnItemClicked();
これらの2つの中間クラスを作成します。 –