使用强类型OOP语言进行鸭子输入的参数?

时间:2009-07-03 14:17:10

标签: oop strong-typing duck-typing

是否存在使用这种语言(例如C#,Java)编写内容并错过鸭子输入的情况? (有关鸭子打字的论据,请参阅this question

4 个答案:

答案 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,它接受​​一个被约束为实现接口IWalkLikeDuckIQuackLikeDuck的泛型参数,那么代码具有泛型类型的变量,该变量被约束为实现两者IWalkLikeDuckIQuackLikeDuck可以将其传递给UseDuck。但是,没有很好的方法可以让代码以一种形式保存它,一旦它退出就可以传递给Wowzo。如果可以定义从其他两个接口继承的duck-typed IWalkAndTalkLikeDuck,那将非常有用,但会自动被视为由实现IWalklikeDuck和{ITalkLikeDuck的任何类实现。 {1}} ,以便可以存储对任何知道在IWalkLikeDuck中实施ITalkLikeDuckList<IWalkAndTalkLikeDuck>的类型的引用。