- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#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しようとすると「親クラスのメソッド隠しちゃうよ」って警告が出ていますね。
ココで親のメソッドが呼ばれるってところでしょうか。確かにコンパイラも、サブクラスで同じメソッド名で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]]
----
この記事は
#vote(おもしろかった,そうでもない)
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}