Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作为泛型函数参数传递的对象的多态行为_C#_Oop_Generics_Polymorphism - Fatal编程技术网

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"