c# - 尽管未实现接口(interface),代码仍能正常工作

标签 c# interface

我有以下代码:

 interface ICalculator
 {
     int Sum ( int x,  int y);
 }

 abstract class AbsCalculator
 {
     public abstract int Sum(int x, int y);
 }

 class Calculator : AbsCalculator, ICalculator
 {
     public override int Sum(int x, int y)
     {
         Console.WriteLine ( "From overriden method" );
         return x + y;
     }
 }

尽管我没有实现接口(interface),但以下语句工作正常并且程序编译:

Calculator calculator = new Calculator();
Console.WriteLine ( calculator.Sum(10, 20) );

所以我的第一个问题是:它为什么有效?

然后,我将以下接口(interface)实现添加到 Calculator 类:

int ICalculator.Sum(int x, int y)
{
     Console.WriteLine("From implemented method");
     return x + y;
}

再次尝试以下语句时:

Calculator calculator = new Calculator();
Console.WriteLine ( calculator.Sum(10, 20) );

从抽象中覆盖的方法仍然被调用。 所以我的第二个问题是:为什么程序调用抽象类的方法而不是接口(interface)的方法?

最佳答案

在 C# 中有两种实现接口(interface)的方法,显式或隐式,但 CLR 只有一种实现类型 - 显式。

当 C# 编译器发现一个类必须实现一个接口(interface)时,它会查找与该接口(interface)所需类的签名匹配的方法,并指示 CLR 这些是实现,以保存您的代码。

因此,在您的情况下,当 C# 编译器发现您的类实现了 ICalculator 时,它将寻找与 Sum(int, int) 的签名匹配的公共(public)方法,并将该方法视为实现。该方法被覆盖的事实并不重要。

如果要对方法的实现赋予另外的含义,则应显式赋予。

关于c# - 尽管未实现接口(interface),代码仍能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19739776/

相关文章:

c# - 为什么我应该在 JSON 反序列化中使用 List<> 而不是数组?

spring-boot - Spring 应用程序通过通用接口(interface)将组件共享到另一个应用程序

go - 为什么返回具体类型不满足需要接口(interface)返回的接口(interface)

c# - 为已经执行的任务创建延续的可靠方法是什么?

c# - 如何获取 blazor 中单选按钮的值?

c# - 发送 POST HttpWebRequest 并且不需要接收响应

c# - 简单队列算法

java - 查找映射值并调用匹配的实现

c++ - 需要从DLL导出纯基类?

interface - Notepad++更改文字颜色?