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

dsi*_*cha 2 refactoring duck-typing language-design syntactic-sugar

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

void myFunction(duck foo) {
   foo.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

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

Bry*_*tts 6

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

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

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