17
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【C#】ポリモーフィズムの意外な動き

Posted at

インターフェースを継承したクラスを継承して新しいクラスを作成したら、C#の仕様を理解していないばかりにハマってしまいました。
インターフェースを継承したクラスに一部機能追加をしたく、次のようなソースを書きました。

IData.cs
interface IData
{
    void Method();
}
DataParent.cs
public class DataParent : IData
{
    public void Method()
    {
        Console.WriteLine("Parent");
    }
}
DataChild.cs
public class DataChild : DataParent
{
    public new void Method()
    {
        Console.Write("Child => ");
        base.Method();
    }
}

こんな感じで

Program.cs
static void Main(string[] args)
{
    DataChild dataChild = new DataChild();
    dataChild.Method();
    IData data = dataChild;
    data.Method();
}

実行してみると

Child => Parent
Parent

となります。
IDataで受けようともDataChildが呼び出されると疑っていませんでした。想定外の動きに頭の中が混乱しましたが、調べたら仕様のようです。
DataChildもIDataで受けたい場合は、継承を追加すれば大丈夫です。

DataChild.cs
public class DataChild : DataParent, IData
{
    public new void Method()
    {
        Console.Write("Child => ");
        base.Method();
    }
}

インターフェースからすると自分を継承しているメソッドを呼び出すようです。知らなかったので焦りましたが、そう言われればそういうもんかな。あまりやらないことをしてあたふたしていました。

17
14
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?