“Ruby中不需要接口和抽象类” - >谁能解释一下?

时间:2011-02-22 10:29:19

标签: ruby interface abstract-class

我正试图绕过Ruby,而我正在努力解决的一件事是缺少接口/抽象类支持。从谷歌搜索,我不断看到抽象类相关的Ruby问题的响应是“你在用Java思考.Ruby不能那样工作”

那么,如果没有接口/抽象类,Ruby如何在Ruby中工作?

例如,在Java中,我可能会创建一个抽象类“book”,其子类为“novel”,“textbook”和“journal”。我在“书”中提到了许多常见功能,但我不希望它直接可访问 - 一本书必须是小说,教科书或期刊。

在ruby中,我将如何写出这种功能?

2 个答案:

答案 0 :(得分:19)

我也是Ruby的首发。根据我的理解,红宝石中的抽象类更接近竞争对手。那是module。你不能创建任何模块实例,但你可以包含另一个类。因此,目标类将获得父

的全部功能
  module Log
    def write
      //blah
    end
  end

  class EventLog
    include Log

    def Prepare
    end
  end

在java / C#等静态类型语言中,Interfaces强制这些类在编译时拥有所有方法。由于Ruby是动态的,因此没有任何意义。

为了更清晰,请查看这些帖子,为什么动态语言不需要接口..

  1. why-dont-we-require-interfaces-in-dynamic-languages
  2. why-do-dynamic-languages-like-ruby-and-python-not-have-the-concept-of-interfaces
  3. 干杯

答案 1 :(得分:0)

有很多方法可以实现这种类型的东西,包括abstract_type gem。虽然ruby不需要它并且有mixins,但我认为有些情况,比如适配器,你需要用一些更明确的东西保护你的接口到一组对象。

另外,请查看http://metabates.com/2011/02/07/building-interfaces-and-abstract-classes-in-ruby/