鸭子类型作为反思的句法糖:好主意还是坏主意?

时间:2008-11-22 18:34:53

标签: refactoring language-design syntactic-sugar duck-typing

我最近一直在想,在Java和C#等语言中,它是一种很好的语法糖形式,包含一个“duck”类型作为方法参数类型吗?这看起来如下:

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

这可能是通过反射调用doStuff()的语法糖,或者它可以以不同的方式实现。 Foo可以是任何类型。如果foo没有doStuff()方法,则会抛出运行时异常。关键在于,当您需要时,您可以获得更严格的预先指定的界面范例(性能,错误检查),即大多数情况下。与此同时,您将拥有一个简单,整洁的后门来进行鸭子打字,这样您就可以在没有大规模重构的情况下干净地进行初始设计中无法预见的更改。此外,它可能是100%向后兼容并与现有语言结构完全啮合。我认为这可能有助于减少过度设计的简单编程风格,从而导致令人困惑,混乱的API。你是否相信像C#和Java这样的静态OO语言中这样的东西会是好事还是坏事?

3 个答案:

答案 0 :(得分:6)

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

但这不仅仅是为了反思。它是dynamic dispatch的一种实现,只有在没有其他机制可用时才使用反射。

This question也有很多好消息。

答案 1 :(得分:1)

实际上,这非常类似于C#4的“动态”类型。

答案 2 :(得分:1)

我的简短回答是“是的,鸭子打字是OO语言中的一个有用的工具.C#团队同意,并将其放入C#4.0”

答案很长:

鸭子打字有其优点和缺点...有很多人完全发誓,但我会告诉你:有一些非常令人信服的理由使用鸭子打字不能做的事情在任何其他情况下解决得很好。

在一个接口上看到我的帖子,该接口带有一个Dictionary而不是一个IDictionary,其中Duck Typing可以保存这一天:

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

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