c# - 与基类具有相同接口的子类具有新的关键字
问题描述
我试图理解为什么它的行为如下
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# - POST 方法发送 RAW TEXT 数据并使用 Jquery AJAX Web 方法获取 HTML 响应并使用 POSTMAN 检查
- javascript - AppleScript (Javascript):删除类,如果
- html - 无法使用 :nth-child(-n+2) 选择前两个子元素
- swift - 使用闭包在两个控制器之间传递数据
- matlab - 求解复矩阵方程
- kubernetes - Ingress 是否仅适用于 Minikube?它在 Ubuntu 安装中不起作用
- excel - 如何在 VBA 的函数中调用函数?
- javascript - 强制事件传播
- ios - 重用 UITableViewCell 时如何初始化 UI 事物
- python - 使用动态规划查找所有子集和