// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。

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

#ref(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と同じポリモフィズムになりました。



-[[Override キーワードと New キーワードによるバージョン管理 (C#)>http://msdn.microsoft.com/ja-jp/library/6fawty39(v=vs.80).aspx]]
new キー



----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS