在下面的代码中,我重现了我遇到但无法理解的C#行为。
这个想法是:
具有类型约束的泛型类(此处为Parent
)具有一种返回T
的方法,根据实现的不同,该方法可以是Parent
或child
(从{ {1}})。
然后将返回的对象传递给一个类的构造函数,该类具有两个构造函数,一个接受Parent
,另一个接受Parent
我期望的行为是,根据传递的对象的类型,将调用两个构造函数,但是仅调用接受Child
的构造函数。
为什么会这样?我是否有办法获得预期的行为?
Parent
上面的程序给出以下输出:
internal class Program
{
internal static void Main(string[] args)
{
new ParentLogicCode().DoAnInstanciation();
new ChildLogicCode().DoAnInstanciation();
Console.ReadKey();
}
}
internal class InstanciatedFromGenericClass
{
internal InstanciatedFromGenericClass(Child thinggy)
{
Console.WriteLine("Constructor with Child type called");
}
internal InstanciatedFromGenericClass(Parent thinggy)
{
Console.WriteLine("Constructor with Parent type called while acutal type is: " + thinggy.GetType());
}
}
internal abstract class LogicCode<T> where T : Parent
{
public void DoAnInstanciation()
{
var thinggy = GetThinggy();
Console.WriteLine("Instanciating with type: " + thinggy.GetType());
var instance = new InstanciatedFromGenericClass(thinggy);
}
protected abstract T GetThinggy();
}
internal class ParentLogicCode : LogicCode<Parent>
{
protected override Parent GetThinggy() => new Parent();
}
internal class ChildLogicCode : LogicCode<Child>
{
protected override Child GetThinggy() => new Child();
}
internal class Parent{}
internal class Child : Parent{}
我们目前已通过使用以下代码解决了该问题,但我们更希望避免这样做,而这会违背泛型的目的...
Instanciating with type: GenericPolymorphismTest.Parent
Constructor with Parent type called while acutal type is: GenericPolymorphismTest.Parent
Instanciating with type: GenericPolymorphismTest.Child
Constructor with Parent type called while acutal type is: GenericPolymorphismTest.Child