【发布时间】:2013-01-20 03:52:11
【问题描述】:
在我的项目中,我发现了一个在 C# 中似乎完全有效的奇怪情况,因为我没有编译时错误。
简化示例如下所示:
using System;
using System.Collections.Generic;
namespace Test
{
interface IFoo
{
void FooMethod();
}
class A
{
public void FooMethod()
{
Console.WriteLine("implementation");
}
}
class B : A, IFoo
{
}
class Program
{
static void Main(string[] args)
{
IFoo foo = new B();
foo.FooMethod();
}
}
}
这样的代码可以编译。但是,请注意 A 不是 IFoo 并且 B 没有实现 IFoo 方法。就我而言,偶然(重构后)A 具有具有相同签名的方法。但是A为什么要知道如何实现IFoo接口的FooMethod呢? A 甚至不知道 IFoo 的存在。
对我来说,这样的设计是危险的。因为每次我实现某个接口时,我都应该检查这个接口中的每个方法是否“干扰”了基类方法。
如果这是“纯 C# 功能”?这叫什么?我错过了什么吗?
【问题讨论】:
-
这对我来说似乎完全合乎逻辑,也正是我所期望的。
-
@BenjaminPaul 在
A类中编写FooMethod实现但未实现IFoo的人实际上打算实现IFoo的可能性有多大?如果是这样,为什么他没有将IFoo接口添加到A实现的接口列表中? -
这叫什么?也许继承的(公共实例)方法实现的接口?
-
这是“纯 C# 功能”吗? 是的,在这种情况下,VB.NET 需要在新类中定义一个显式的
Implements方法。 -
有人能说明为什么微软以这种方式指定语言吗?程序员从中获得了什么?