|
ポリモーフィズムについていろいろ確認してみました。なんだかいろいろ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と同じポリモフィズムになりました。 この記事は 現在のアクセス:2962 |