インターフェースを継承したクラスを継承して新しいクラスを作成したら、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();
}
}
インターフェースからすると自分を継承しているメソッドを呼び出すようです。知らなかったので焦りましたが、そう言われればそういうもんかな。あまりやらないことをしてあたふたしていました。