【发布时间】:2013-06-17 18:06:42
【问题描述】:
今天,close() 方法发生了一件奇怪的事情。
这是有疑问的代码:
interface ICloseable
{
void Close();
}
public class Closer
{
public void Close()
{
Console.WriteLine("closed");
}
}
public class ConcreteCloser : Closer, ICloseable
{
}
class Program
{
static void Main(string[] args)
{
var concrete = new ConcreteCloser();
concrete.Close();
Console.ReadKey();
}
}
所以问题是:
基类没有实现接口。
为什么编译器接受Closer.close()方法作为实现
接口方法?
为什么在 Visual C# 2010 Professional 中都没有一个警告 和日食?
对我来说,C# 和 Java 在这种情况下有点鸭式。
有人可以解释一下这背后的语言考虑吗? 由于 C# 和 Java 都以相同的方式执行此操作,因此似乎有充分的理由。
【问题讨论】:
-
关闭投票给离题?为什么?
-
附带说明:.net 也有“动态”,它确实允许基本上是鸭式打字。但是,这与接口完全无关(本例)。
-
@nawfal 你介意推荐一个更好的吗?这只是我试图传达对我来说“错误”的地方。
标签: c# java inheritance interface duck-typing