たこぜりー研究室

大腸菌DNAは4.64Mbp。酵母は13Mbpで、ヒトは3Gbp

スポンサーサイト

#
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ポリモーフィズム #2

#474
前回の続き。
using System;

namespace ConsoleApp
{
  interface IA
  {
    string Who();
  }

  class B : IA
  {
    public string Who() { return "B"; }
  }

  class C : B, IA
  {
    public new string Who() { return "C"; }
  }

  class Program
  {
    static void Main()
    {
      C c = new C();

      CallC(c); CallB(c); CallA(c);
    }

    static void CallC(C c)
    {
      Console.WriteLine("そのまま : " + c.Who());
    }

    static void CallB(B b)
    {
      Console.WriteLine("B に変換 : " + b.Who());
    }

    static void CallA(IA a)
    {
      Console.WriteLine("IA に変換 : " + a.Who());
    }
  }
}

前回との違いは派生クラスでもインターフェイスの実装を宣言しているところ。つまり、インターフェイスの明示的な再実装。

結果 :
そのまま : C
B に変換 : B
IA に変換 : C

理由 :
クラスでは、継承した基本クラスやインターフェイスを介して、インターフェイスを繰り返し継承できます。このときクラスは、インターフェイスが新しいクラスの一部として宣言されている場合、インターフェイスを 1 回のみ実装できます。継承されたインターフェイスが新しいクラスの一部として宣言されていない場合、インターフェイスの実装は、それを宣言した基本クラスによって提供されます。 [MSDN Library]

だから前回、インターフェイス型にキャストすると基本クラスのメンバが呼ばれた、ということ。

つづく

コメント


コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURL:  http://takojelly.blog2.fc2.com/tb.php/474-6cfa9f99
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。