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是的。我犯了一个错误:)。现在我明白了