C# 作为泛型函数参数传递的对象的多态行为
假设存在这样的类层次结构:C# 作为泛型函数参数传递的对象的多态行为,c#,oop,generics,polymorphism,C#,Oop,Generics,Polymorphism,假设存在这样的类层次结构: public class Parent { public virtual void Fun() { Console.WriteLine("In Parent"); } } public class FirstChild : Parent { public override void Fun() { Console.WriteL
public class Parent
{
public virtual void Fun()
{
Console.WriteLine("In Parent");
}
}
public class FirstChild : Parent
{
public override void Fun()
{
Console.WriteLine("In FirstChild");
}
}
public class SecondChild : FirstChild
{
public new void Fun()
{
Console.WriteLine("In SecondChild");
}
}
然后我们定义一个通用方法,该方法接受从父级派生的参数:
public static void Test<T>(T entity) where T : Parent
{
entity.Fun();
}
问题是为什么调用FirstChild中的Fun方法而不是SecondChild中定义的Fun方法
幕后是否涉及演员阵容?请注意,您正在使用
new
而不是override
来进行SecondChild
中的Fun
。这是故意的吗?将其更改为override
,它应该可以按预期工作。这是否回答了您的问题Test
可以调用在Parent
,SecondChild中定义的任何方法。Fun
在SecondChild
中定义,而不是在Parent
中定义。是的,它是有意从声明的变量类型而不是从运行时类型执行方法。如果我跳过泛型方法,结果将如预期的那样,但我不确定泛型为什么会改变这种行为。请注意,您在SecondChild
中使用的是new
而不是override
。这是故意的吗?将其更改为override
,它应该可以按预期工作。这是否回答了您的问题Test
可以调用在Parent
,SecondChild中定义的任何方法。Fun
在SecondChild
中定义,而不是在Parent
中定义。是的,它是有意从声明的变量类型而不是从运行时类型执行方法。如果我跳过泛型方法,结果将如预期的那样,但我不确定泛型为什么会改变这种行为。
SecondChild child = new SecondChild();
Test(child); // Displays "In FirstChild"