【问题标题】:Arguments for duck-typing in a strongly-typed OOP language?在强类型 OOP 语言中进行鸭子类型的参数?
【发布时间】:2009-07-03 14:17:10
【问题描述】:

有没有用这种语言(例如 C#、Java)写东西而错过了鸭子类型的情况? (请参阅 this question 了解反对鸭子类型的论点)

【问题讨论】:

  • 我假设您的意思是静态类型而不是强类型?
  • Kylotan,不,那是矛盾的。动态 静态,强 弱是正交的。
  • 我知道,这就是我要表达的意思:问题的措辞暗示强类型语言没有鸭子类型。他们中的一些人这样做,即。蟒蛇。

标签: oop strong-typing duck-typing


【解决方案1】:

每次您需要使用不属于您的代码并且没有适当的抽象(HttpContext 任何人?)。由于您不能让自己的方法接受 IHttpContext,因为 HttpContext 类型没有那种抽象,所以您必须满足于 Adapter 和/或 Factory 等。 如果您可以在代码中定义 IHttpContext 契约,使其看起来像 HttpContext,将您的方法设置为接受 IHttpContext,并传入一个真实的、真实的 HttpContext 对象以躲避到 IHttpContext 中,那就更好了。

【讨论】:

  • 我看到你的第一个答案 :)
  • 你应该更加努力:)
【解决方案2】:

另一个问题与鸭子打字无关。无论如何,假设这不会关闭,我会说我真正想念鸭子打字的一次是在尝试使用大型 API 测试类时。我们需要一个单独的框架来创建它们的模拟,而在另一种编程语言中,您可以想象只需传入一个实现您所需要的基本基础的自写类。

例如,尝试在没有框架的情况下在 java 中模拟一个 JDBC ResultSet,这有点痛苦。

【讨论】:

    【解决方案3】:

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

    这就是为什么我从来没有错过在 Java 中输入鸭子的原因。

    “Java 中的 Duck Typing 问题”实际上是关于理解多态性的绝对失败。如果您认为您需要任何类型的运行时类型识别或“isinstance”功能,那么您就没有掌握多态性并且您做错了。

    请参阅Programmer Ignorance Pet Peeve 问题。未能掌握多态性是一个大问题,会导致这种“Java 中的鸭子类型”错误。

    如果你了解多态,你就不需要鸭子类型,在 Python 和 Java 之间切换时也不会错过它。

    在相关说明中,我只使用 Python 的 isinstance() 作为断言的一部分,以使需要整数的函数在获得非整数时崩溃。 isinstance() 有时用于在 Java 中尝试做鸭子类型的事情。

    关键是我已经老了(52 岁)而且不是很聪明。所以我必须在 Python 中保持“强”类层次结构,否则我会感到困惑。我总是在 Python 设计中留出空间,以便在必要时重构为更严格的类层次结构。

    【讨论】:

    • 使用 isinstance 不是鸭式打字,实际上它颠覆了鸭式打字。类 A { 方法 foo() { ... } } 类 B { 方法 foo() { ... } } 函数 not_duck_typed(x) { if( x isinstance A ) { x.foo() } } 函数 Duke_typed(x ) { x.foo() } 鸭子类型的重点是,您可以将 A 或 B 的实例传递给duck_typed,尽管它们不共享共同的祖先或正式接口。鸭子类型仍然是多态性。
    • 您将运行时类型识别/isinstance 与鸭子类型混淆了。在 Java 中,接口是显式定义的——在鸭子类型语言中,它们是由对象公开的方法隐式定义的。
    【解决方案4】:

    在语言试图解决设计弱点的情况下(如 C#foreach 构造的情况),永远不需要让语言基于方法签名执行鸭子类型。另一方面,在很多情况下,使用接口做一些类似于鸭式打字的事情会很有帮助。例如,如果一个方法 UseDuck 采用一个泛型参数,该参数被限制为实现接口 IWalkLikeDuckIQuackLikeDuck,则该代码具有一个泛型类型的变量,该变量被限制为同时实现 IWalkLikeDuck 和 @987654326 @ 可以将其传递给UseDuck。但是,没有好的方法可以让代码以一种可以在退出后传递给Wowzo 的形式保存它。如果可以定义一个鸭子类型的IWalkAndTalkLikeDuck,这将非常有帮助,它继承自其他两个接口,但会自动被任何实现IWalklikeDuckITalkLikeDuck 的类视为实现 em>,这样就可以将任何已知类型的引用存储到 IWalkLikeDuckITalkLikeDuck 中实现 List<IWalkAndTalkLikeDuck>

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多