2

我最近一直在想,在 Java 和 C# 等语言中,将“鸭子”类型作为方法参数类型包含在内是否是一种很好的语法糖形式?这将如下所示:

void myFunction(duck foo) {
   foo.doStuff();
}

这可能是通过反射调用 doStuff() 的语法糖,或者它可以以不同的方式实现。Foo 可以是任何类型。如果 foo 没有 doStuff() 方法,这将引发运行时异常。关键是,当您需要时,即大多数时候,您将获得更严格的预先指定的接口范例(性能、错误检查)的好处。同时,您将拥有一个简单、干净的后门来避免打字,这将允许您干净地进行初始设计中未预见到的更改,而无需进行大量重构。此外,它可能会 100% 向后兼容,并与现有的语言结构完美结合。我认为这可能有助于减少过度设计的以防万一的编程风格,这种风格会导致混乱、混乱的 API。

4

3 回答 3

6

dynamic关键字支持这些确切的语义并将在 C# 4.0 中。

不过,这不仅仅是为了反思。它是动态调度的一种实现,只有在没有其他机制可用时才使用反射。

这个问题也有很多很好的信息。

于 2008-11-22T18:41:26.140 回答
1

实际上,这非常类似于将成为 C#4 一部分的“动态”类型。

于 2008-11-22T18:41:56.967 回答
1

我的简短回答是“是的,Duck Typing 在 OO 语言中将是一个有用的工具。C# 团队同意,并将其放入 C# 4.0”

长答案:

Duck Typing 有其优点和缺点......有很多人完全发誓,但我会告诉你:有一些非常令人信服的理由将 Duck Typing 用于无法很好解决的事情任何其他情况。

请参阅我在使用 Dictionary 而不是 IDictionary 的界面上发布的帖子,Duck Typing 可以节省一天的时间:

http://www.houseofbilz.com/archive/2008/09/22/why-you-really-need-to-think-about-your-interfaces.aspx

C# 从 1.0 开始就内置了一些鸭子类型!以 foreach 关键字为例。一个常见的误解是,您的类型需要是 IEnumerable 才能在 foreach 循环中使用对象。事实证明,事实并非如此。您只需要实现 GetEnumerator() 并且不需要实现接口(尽管它是很好的形式)。这是鸭子打字。

于 2008-11-22T18:58:13.907 回答