【问题标题】:Interface in a dynamic language?动态语言界面?
【发布时间】:2011-02-10 19:53:18
【问题描述】:

接口(或具有所有抽象方法的抽象类)是静态类型语言(如 C#、JAVA)中的强大武器。它允许以统一的方式使用不同的派生类型。设计模式鼓励我们尽可能多地使用界面。

但是,在动态类型语言中,不会在编译时检查所有对象的类型。他们不必实现以特定方式使用的接口。您只需要确保它们定义了一些方法(属性)。这使得接口不是必需的,或者至少不像静态语言那样有用。

典型的动态语言(例如 ruby​​)是否有接口?如果有,那么拥有它有什么好处?如果不是这样,那么我们是否会失去许多需要界面的精美设计模式?

谢谢。

【问题讨论】:

    标签: interface dynamic-languages


    【解决方案1】:

    我想所有动态语言都没有单一的答案。例如,在 Python 中,没有接口,但有多重继承。使用类接口类仍然有用:

    • 类接口类可以提供方法的默认实现;
    • 鸭式打字很好,但在一定程度上;有时能够编写isinstance(x, SomeType) 很有用,尤其是当SomeType 包含许多 方法时。

    【讨论】:

    • 如果一个类提供了默认实现,那么它就不是类接口的,因为接口与抽象类的不同之处在于它们不能包含任何实现。
    • @sepp2k,我同意。这不是我所说的接口。
    • @sepp2k:大多数语言/框架的根本区别在于,因为接口不支持中级成员覆盖,所以一个类可以实现多个接口。允许接口方法指定默认实现在它们的声明点不会启用任何致命的钻石场景,但会大大提高许多操作的效率,比如IEnumerable,尤其是那些嵌套在Append 生成的聚合类型。例如,如果有人调用Append 加入一个包含 5,000,000 个项目的集合......
    • ...它可以通过读取一个字段来返回其Count,以及一个不知道其计数的五项集合,让Count成为IEnumerable的成员,这将,默认情况下,遍历集合并计数成员将允许聚合对象相对有效地报告其Count(有必要遍历五项集合,但不是 5,000,000 项集合)。让对象只实现Count 之类的东西,如果它们能“很好”地完成它们,那么高效聚合就不可能了。
    【解决方案2】:

    动态语言中的接口可用作可自动检查的 API 文档,例如通过开发工具或运行时断言。

    例如,zope.interface 是 Python 中接口的事实标准。 Zope 和 Twisted 等公开大量 API 以供消费的项目发现它很有用,但据我所知,它在此类项目之外使用得不多。

    【讨论】:

      【解决方案3】:

      在 Ruby 中,这是一种动态类型语言并且只允许单一继承,您可以通过 mixins 来模拟“接口”,而不是用“接口”的方法污染类。

      Mixins 部分模拟了多重继承,允许一个对象从多个来源“继承”,但没有实际拥有多个父对象的模糊性和复杂性。只有一位真正的父母。

      要实现一个接口(在抽象意义上,而不是静态类型语言中的实际接口类型),您可以将模块定义为静态语言中的接口。然后,您将其包含在课程中。瞧!您已将鸭子类型收集到本质上是一个界面的内容中。

      非常简单的例子:

      module Equippable
        def weapon
          "broadsword"
        end
      end
      
      
      class Hero
        include Equippable
      
        def hero_method_1
        end
      
        def hero_method_2
        end
      end
      
      
      class Mount
        include Equippable
      
        def mount_method_1
        end
      end
      
      
      h = Hero.new
      h.weapon    # outputs "broadsword"
      
      
      m = Mount.new
      m.weapon    # outputs "broadsword"
      

      Equippable 是 Hero、Mount 和任何其他包含它的类或模型的接口。

      (显然,武器很可能由初始化程序动态设置,在本例中已被简化。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        相关资源
        最近更新 更多