首页 > 解决方案 > 与基类具有相同接口的子类具有新的关键字

问题描述

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

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 它应该调用基类方法为什么它调用 Child 1 Display

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

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

标签: c#oop

解决方案


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

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


推荐阅读