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 - Fatal编程技术网

C# 具有与基类相同接口且具有新关键字的子类

C# 具有与基类相同接口且具有新关键字的子类,c#,oop,C#,Oop,我试图理解为什么它的行为如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstarctWithInterfcae { public interface IBase { void Display(); } public abstract class Base : IBase

我试图理解为什么它的行为如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstarctWithInterfcae
{  
public interface IBase
{
    void Display();
}

public abstract class Base : IBase
{        
    public void Display()
    {
        Console.WriteLine("Base Display");
    }
}


public class child1 : Base, IBase
{
    public new void Display()
    {
        Console.WriteLine("child1 Display");
    }
}

public class child2 : Base,IBase
{     
    public new void Display()
    {
        Console.WriteLine("child2 Display");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IBase obj = new child1();
        obj.Display(); // writing child1 display
        IBase obj2 = new child2();
        obj.Display(); //Wrirting child1 dispaly
        Console.ReadLine();
    }
}
}
第一个问题:

在上面的程序中,当我使用new时,它应该调用基类方法为什么 正在调用子1显示

根据我的理解,我们有一个基类,它已经实现了IBase,所以当我们通过引用接口为child1创建实例时,它应该调用基类方法,因为它包含基类并具有新的关键字


如果有人给出解释,我们将不胜感激

您在这里看到的是接口的重新实现。在第一种情况下,基类是实现接口的最派生类,因此它将接口的方法绑定到方法的实现。由于该方法不是虚拟的,因此它不能被重写,也不会被重写,因此在基类或派生类上使用该接口时,将调用该方法


在第二个示例中,您在派生类上重新实现了接口(通过将其添加到类的声明中)。这将使用该类型重新绑定接口的方法。因为它有一个合适的方法,所以每当使用接口为派生类型分派方法时,都会使用它的实现。

场景1是因为您使用的是
obj.Display()
而不是
obj2.Display()

场景2是因为您使用的是通用接口参考
IBase
,(
IBase obj=new child2()
)和C#将选择最简单的类型以适合实际对象类型,因为它假定您希望在该类型的“最不特定的版本”上操作,因为您不是特定的

编辑:注意到反对票,我假设有人认为这个答案不够完整


如果OP希望看到错误2的正确输出,他们可以将类型实例化为
child2obj=newchild2()

您的意思是在第二种情况下(在ReadLine之前)显示的
obj2.Display()
?如果显示的基本定义是虚拟的,那么子实现可以覆盖基本定义而不是隐藏它?可能重复@vc74是的。我犯了一个错误:)。现在我明白了