是否存在使用这种语言(例如C#,Java)编写内容并错过鸭子输入的情况? (有关鸭子打字的论据,请参阅this question)
答案 0 :(得分:3)
每次你需要使用你不拥有的代码,并且没有适当的抽象(HttpContext任何人?)。因为你不能拥有你的方法接受IHttpContext,因为HttpContext类型没有那种抽象,你必须选择适配器和/或工厂等。 如果您可以在代码中定义IHttpContext合约,使其看起来像HttpContext,将您的方法设置为接受IHttpContext,并且将一个真实的,真实的HttpContext对象传入duck in IHttpContext,那本来会更好。
答案 1 :(得分:2)
其他问题与鸭子打字没什么关系。无论如何,假设这没有关闭,我会说有一次我真的想念鸭子打字是在尝试用大API测试类时。我们需要一个单独的框架来创建它们的模拟,而在另一种编程语言中,你可以想象只是通过一个自我编写的类来实现你所需要的基础知识。
例如,尝试在没有框架的情况下在java中模拟JDBC ResultSet,这有点痛苦。
答案 2 :(得分:2)
从不。从'90年代开始使用Java和自01年左右开始使用Python。
这就是为什么我从未错过用Java打字的原因。
“Java问题中的鸭子打字”实际上是关于理解多态性的绝对失败。如果您认为您需要任何类型的运行时类型识别或“isinstance”功能,那么您就无法掌握多态性并且您做错了。
请参阅Programmer Ignorance Pet Peeve问题。未能掌握多态性是一个巨大的问题,并导致这种“鸭子输入Java”的错误。
如果您了解多态性,则不需要进行鸭子输入,并且在Python和Java之间切换时不会错过它。
在相关的说明中,我只使用Python的isinstance()
作为断言的一部分来创建一个函数,当它获得非整数时需要整数爆炸。 isinstance()
有时会与Java中的尝试一起用来做类似鸭子的事情。
关键是我已经老了(52岁)并且不太聪明。所以我必须在Python中保持一个“强大的”类层次结构,否则我会感到困惑。我总是在Python设计中留下一个空间,以便在必要时重构为更严格的类层次结构。
答案 3 :(得分:0)
在语言试图解决设计弱点的情况下(如C#foreach
构造的情况),在语言执行基于方法签名的鸭子类型之前永远不需要。另一方面,在许多情况下,使用接口执行类似于鸭子输入的操作会很有帮助。例如,如果有一个方法UseDuck
,它接受一个被约束为实现接口IWalkLikeDuck
和IQuackLikeDuck
的泛型参数,那么代码具有泛型类型的变量,该变量被约束为实现两者IWalkLikeDuck
和IQuackLikeDuck
可以将其传递给UseDuck
。但是,没有很好的方法可以让代码以一种形式保存它,一旦它退出就可以传递给Wowzo
。如果可以定义从其他两个接口继承的duck-typed IWalkAndTalkLikeDuck
,那将非常有用,但会自动被视为由实现IWalklikeDuck
和{ITalkLikeDuck
的任何类实现。 {1}} ,以便可以存储对任何知道在IWalkLikeDuck
中实施ITalkLikeDuck
和List<IWalkAndTalkLikeDuck>
的类型的引用。