インターフェイスを実装しているので、ポリモーフィズムはおそらく維持したいものです。基本クラスを仮想で変更せずにメソッドをオーバーライドすることは不可能であるため、Tigranが書いたように仮想ではなくnewを使用する必要があります。
これは、この種のコードを記述しているが、メソッドの基本バージョンのみが実行されることを意味します。
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();