【问题标题】:"Interfaces & Abstract Classes unnecessary in Ruby" --> Can someone explain?“Ruby 中不需要接口和抽象类”--> 有人可以解释一下吗?
【发布时间】:2011-07-01 21:46:06
【问题描述】:

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

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

例如,在 Java 中,我可能会创建一个抽象类“book”,其中包含子类“novel”、“textbook”和“journal”。我在“书”中添加了很多常用功能,但我不希望它可以直接访问 - 书必须是小说、教科书或期刊。

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

【问题讨论】:

标签: ruby interface abstract-class


【解决方案1】:

我也是 Ruby 初学者。据我了解,ruby 中的抽象类有一个更接近的竞争对手。那是module。您不能创建模块的任何实例,但可以包含在另一个类中。所以目标类将获得父类的全部功能

  module Log
    def write
      //blah
    end
  end

  class EventLog
    include Log

    def Prepare
    end
  end

在像 java/C# 这样的静态类型语言中,接口强制类在编译时拥有所有方法。由于 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

干杯

【讨论】:

  • 这些被称为混入(编辑:一种混入,在这种情况下include 影响实例方法,而您也可以使用extend 这将影响类方法......希望我解释正确) ,如果我没记错的话。本质上,该模块提供了在多个类之间共享的功能,但它本身并不是一个类。在此过程中,您无法实例化 Book 模块,但您可以实例化包含 Book 模块的 Journal 类。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2011-11-22
    • 2016-12-12
    • 2011-02-11
    相关资源
    最近更新 更多