"Интерфейсы и абстрактные классы ненужные в Ruby" -> Кто-нибудь может объяснить? - PullRequest
16 голосов
/ 22 февраля 2011

Я пытаюсь обернуть голову вокруг Ruby, и одна вещь, с которой я борюсь, это отсутствие поддержки интерфейса / абстрактного класса.Начиная с поиска в Google, я постоянно вижу ответ на абстрактные вопросы Ruby, относящиеся к классам: «Вы думаете на Java. Ruby так не работает»

Итак, как можно работать в Ruby без интерфейсов / аннотацияклассы?

Например, в Java я мог бы создать абстрактный класс «книга» с подклассами «роман», «учебник» и «журнал».Существует много общих функций, которые я добавляю в «книгу», но я не хочу, чтобы она была доступна напрямую - книга должна быть либо романом, учебником или журналом.

В рубине как быЯ пишу такую ​​функциональность?

Ответы [ 2 ]

19 голосов
/ 22 февраля 2011

Я также Ruby Starter. Насколько я понимаю, в ruby ​​есть более близкий конкурент абстрактным классам. это module. Вы не можете создавать экземпляры модуля, но можете включить их в другой класс. Таким образом, целевой класс получит всю функциональность родителя

  module Log
    def write
      //blah
    end
  end

  class EventLog
    include Log

    def Prepare
    end
  end

В статически типизированных языках, таких как java / C #, интерфейсы заставляют классы иметь все методы во время компиляции. Поскольку Ruby динамичен, в этом нет никакого смысла.

Для большей ясности посмотрите эти посты, почему динамические языки не требуют интерфейсов ..

  1. почему-Dont-мы-требуют-интерфейсов-в-динамических-языков
  2. почему-до-динамические-языки-как-рубиновый-и-питон-не-есть-на-концепции-на-интерфейсов

Приветствия

0 голосов
/ 03 января 2014

есть способы реализовать этот тип вещей, включая gem abstract_type.Хотя ruby ​​этого не требует и имеет миксины, я думаю, что есть случаи, например, адаптеры, в которых вы хотите защитить свой интерфейс от набора объектов с чем-то более явным.

также, проверьте http://metabates.com/2011/02/07/building-interfaces-and-abstract-classes-in-ruby/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...