强类型OOP语言中duck类型的参数?

强类型OOP语言中duck类型的参数?,oop,strong-typing,duck-typing,Oop,Strong Typing,Duck Typing,有没有这样一种情况,你用这样一种语言(例如C#、Java)写了一些东西,却没有键入duck?(有关反对duck类型的论点,请参阅)其他问题与duck类型几乎没有关系。不管怎么说,假设这还没有结束,我会说我真正怀念duck类型的一次是在尝试使用大API测试类时。我们需要一个单独的框架来创建它们的模拟,而在另一种编程语言中,您可以想象只需传入一个自行编写的类,该类实现了所需的基本功能 例如,尝试在java中模拟一个没有框架的JDBC结果集,这有点痛苦。另一个问题与duck类型无关。不管怎么说,假设这

有没有这样一种情况,你用这样一种语言(例如C#、Java)写了一些东西,却没有键入duck?(有关反对duck类型的论点,请参阅)

其他问题与duck类型几乎没有关系。不管怎么说,假设这还没有结束,我会说我真正怀念duck类型的一次是在尝试使用大API测试类时。我们需要一个单独的框架来创建它们的模拟,而在另一种编程语言中,您可以想象只需传入一个自行编写的类,该类实现了所需的基本功能


例如,尝试在java中模拟一个没有框架的JDBC结果集,这有点痛苦。

另一个问题与duck类型无关。不管怎么说,假设这还没有结束,我会说我真正怀念duck类型的一次是在尝试使用大API测试类时。我们需要一个单独的框架来创建它们的模拟,而在另一种编程语言中,您可以想象只需传入一个自行编写的类,该类实现了所需的基本功能


例如,尝试在没有框架的情况下在java中模拟JDBC结果集,这有点麻烦。

每次您需要使用自己没有的代码,并且没有适当的抽象(HttpContext有人?)。由于您不能让自己的方法接受IHttpContext,因为HttpContext类型没有这种抽象,所以您必须满足于适配器和/或工厂等。
如果您能够在代码中定义IHttpContext契约,使其看起来像HttpContext,将您的方法设置为接受IHttpContext,并传入一个真实的HttpContext对象以嵌入IHttpContext,则会非常好。

每次您需要使用非自己的代码时,而且它没有适当的抽象(HttpContext,有人吗?)。由于您不能让自己的方法接受IHttpContext,因为HttpContext类型没有这种抽象,所以您必须满足于适配器和/或工厂等。
如果您能够在代码中定义IHttpContext契约,使其看起来像HttpContext,将您的方法设置为接受IHttpContext,并传递一个真实的HttpContext对象以嵌入IHttpContext,那么会非常好。

永远不会。从90年代开始使用Java,从01年左右开始使用Python

这就是为什么我从未错过Java中的duck输入

“Java中的鸭子类型问题”实际上是关于理解多态性的绝对失败。如果您曾经认为您需要任何类型的运行时类型标识或“isinstance”功能,那么您就没有掌握多态性,而且您做得不对

请看问题。未能掌握多态性是一个巨大的问题,并导致这种“Java中的鸭子类型”错误

如果您了解多态性,就不需要duck类型,在Python和Java之间切换时也不会错过它

另一方面,我只使用Python的
isinstance()
作为断言的一部分,使一个函数在得到非整数时需要整数
isinstance()
有时用于在Java中尝试进行类似duck类型的操作


关键是我年纪大了(52岁),不是很聪明。因此,我必须在Python中保持“强ish”类层次结构,否则我会感到困惑。我总是在Python设计中留下空间,以便在必要时重构为更严格的类层次结构。

从来没有。从90年代开始使用Java,从01年左右开始使用Python

这就是为什么我从未错过Java中的duck输入

“Java中的鸭子类型问题”实际上是关于理解多态性的绝对失败。如果您曾经认为您需要任何类型的运行时类型标识或“isinstance”功能,那么您就没有掌握多态性,而且您做得不对

请看问题。未能掌握多态性是一个巨大的问题,并导致这种“Java中的鸭子类型”错误

如果您了解多态性,就不需要duck类型,在Python和Java之间切换时也不会错过它

另一方面,我只使用Python的
isinstance()
作为断言的一部分,使一个函数在得到非整数时需要整数
isinstance()
有时用于在Java中尝试进行类似duck类型的操作


关键是我年纪大了(52岁),不是很聪明。因此,我必须在Python中保持“强ish”类层次结构,否则我会感到困惑。我总是在Python设计中留有空间,以便在必要时重构成更严格的类层次结构。

在语言试图解决设计弱点的情况下(如C#
foreach
构造),让语言基于方法签名执行duck类型应该是绝对不必要的. 另一方面,在许多情况下,使用接口执行类似于duck类型的操作会有所帮助。例如,如果有一个方法
UseDuck
,该方法接受一个通用参数,该参数被约束为实现接口
IWalkLikeDuck
IWalkLikeDuck
,具有泛型类型变量的代码,该变量被约束为同时实现
IWalkLikeDuck
IWalkLikeDuck
可以将其传递给
UseDuck
。但是,对于代码来说,没有一种好方法可以将其持久化为一种一旦退出就可以传递给
Wowzo
的形式。如果可以定义一个duck类型的
IWalkAndTalkLikeDuck
,它继承了其他两个接口,但会自动被认为是由实现了
IWalklikeDuck
ITalkLikeDuck
的任何类实现的,这将非常有用,这样就可以将对已知实现
IWalkLikeDuck
ITalkLikeDuck
的任何类型的引用存储到具有语言的
列表中