Подтвердить что ты не робот

"Интерфейсы и абстрактные классы не нужны в Ruby" → Может кто-нибудь объяснить?

Я пытаюсь обернуть голову вокруг Ruby, и одна вещь, с которой я борюсь, - отсутствие поддержки интерфейса/абстрактного класса. От googling about, ответ, который я постоянно вижу в абстрактных классах, связанных с Ruby, заключается в следующем: "Вы думаете на Java. Ruby не работает именно так"

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

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

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

4b9b3361

Ответ 1

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

  module Log
    def write
      //blah
    end
  end

  class EventLog
    include Log

    def Prepare
    end
  end

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

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

Приветствия

Ответ 2

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

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