ポリモーフィズムについていろいろ確認してみました。なんだかいろいろ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しようとすると「親クラスのメソッド隠しちゃうよ」って警告が出ていますね。

01.png

いわゆる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と同じポリモフィズムになりました。


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

現在のアクセス:2712


添付ファイル: file01.png 504件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-12-12 (日) 20:14:59 (5108d)