ポリモーフィズムについていろいろ確認してみました。なんだかいろいろJavaとは異なるようですね。 namespace InterfaceSample { public interface IParent { void execute1(); } public abstract class AParent { public void execute2() { Console.WriteLine("親クラスのメソッドです"); } } class Child : AParent, IParent { public void execute1() { Console.WriteLine("子クラスでinterfaceのメソッドを実装しました"); } public void execute2() { Console.WriteLine("子クラスでAParentのメソッドをoverrideしたつもり"); } } class Program { static void Main(string[] args) { IParent iParent = new Child(); iParent.execute1(); //overrideしたChildのメソッドが呼ばれる AParent aParent = new Child(); aParent.execute2(); //overrideしたChildのメソッドが呼ばれる、、はずが呼ばれない。 } } } なかなかと衝撃的なのが、ポリモフィズムしたつもりでも、 AParent aParent = new Child(); aParent.execute2(); //overrideしたChildのメソッドが呼ばれる、、はずが呼ばれない。 ココで親のメソッドが呼ばれるってところでしょうか。確かにコンパイラも、サブクラスで同じメソッド名でoverrideしようとすると「親クラスのメソッド隠しちゃうよ」って警告が出ていますね。 いわゆるJavaのようにサブクラス(というか右辺の実装クラス)のメソッドが呼び出されるようにするには、親クラスでvirtualキーワードを記述し、サブクラスではoverrideキーワードを記述します public abstract class AParent { public virtual void execute2() { Console.WriteLine("親クラスのメソッドです"); } } class Child : AParent, IParent { public override void execute2() { Console.WriteLine("子クラスでAParentのメソッドをoverrideしたつもり"); } } これでJavaと同じポリモフィズムになりました。 この記事は 現在のアクセス:2712 |