最初のクラスから派生したBaseDataClassとDerivedDataClassの 2 つのデータ クラスがあります。また、最初のクラスから派生したConsumingBaseClassとConsumingDerivedClassの 2 つの Consuming クラスがあります。ConsumingBaseClassには、 DerivedDataClassを受け入れて何らかの作業を行う仮想メソッドDoWorkがあります。
ConsumingDerivedClassでは、メソッドDoWorkのオーバーライドがあり、また、 BaseDataClassを受け入れるDoWorkのオーバーロードがあります。DoWorkを呼び出そうとすると、 DerivedDataClassのインスタンスを渡して、 DoWork (DerivedDataClass)の代わりにDoWork (BaseDataClass)が呼び出されます。
なぜ間違ったメソッドが呼び出されるのか、誰にもわかりませんか?
次のコードは、問題を示しています。
class Program
{
private static void Main(string[] args)
{
ConsumingDerivedClass x = new ConsumingDerivedClass();
// Wrong DoWork is called - expected calling of DoWork(DerivedDataClass) but actually called DoWork(BaseDataClass)
x.DoWork(new DerivedDataClass());
Console.ReadKey();
}
}
public class ConsumingBaseClass
{
public virtual void DoWork(DerivedDataClass instance)
{
Console.WriteLine("ConsumingBaseClass.DoWork(DerivedDataClass); Type of argument is '{0}'", instance.GetType());
}
}
public class ConsumingDerivedClass : ConsumingBaseClass
{
public override void DoWork(DerivedDataClass instance)
{
Console.WriteLine("ConsumingDerivedClass.DoWork(DerivedDataClass); Type of argument is '{0}'", instance.GetType());
base.DoWork(instance);
// Some additional logic
}
public void DoWork(BaseDataClass instance)
{
Console.WriteLine("ConsumingDerivedClass.DoWork(BaseDataClass); Type of argument is '{0}'", instance.GetType());
DerivedDataClass derivedInstance = new DerivedDataClass();
// Some logic based on what is in baseInstacne
derivedInstance.SomeProperty = "Value, got from some logic";
base.DoWork(derivedInstance);
// Some additional logic
}
}
public class BaseDataClass
{ }
public class DerivedDataClass : BaseDataClass
{
public string SomeProperty { get; set; }
}