Определение attr_accessor в родительском классе с использованием констант из дочерних классов - PullRequest
1 голос
/ 04 июля 2019

У меня есть родительский класс, а некоторые дочерние классы

class Base
end
class ChildNameAge < Base
  ATTRIBUTES = [:name, :age]
  attr_accessor *ATTRIBUTES
end
class ChildHeightWidth < Base
  ATTRIBUTES = [:height, :width]
  attr_accessor *ATTRIBUTES
end

Как я могу переместить этот attr_accessor в родительский класс, но по-прежнему использовать ATTRIBUTES константу из дочерних классов, поэтому мне не пришлось бы повторять это attr_accessor *ATTRIBUTES для каждого дочернего класса.

Ответы [ 2 ]

3 голосов
/ 05 июля 2019

Ваш вопрос в корне ошибочный.Вы инвертируете цикл зависимости наследования на основе классов.

Родители не могут знать что-либо об их детях по определению наследования на основе классов.

Перемещение attr_accessorкласс Base (родительский) будет означать, что он будет иметь доступ только к значениям, определенным , сам по себе , но не к его дочерним элементам!

0 голосов
/ 05 июля 2019

Вы определите ATTRIBUTES в Base как хэш, связывающий имя класса с атрибутами и будете использовать унаследованный метод для Class.

class Base
  ATTRIBUTES = {
    "ChildNameAge" => [:name, :age],
    "ChildHeightWidth" => [:height, :width]
  }

  def self.inherited(child)
    return unless (attributes = ATTRIBUTES[child.name])
    child.class_eval { attr_accessor *attributes }
  end
end

Таким образом, когда вы создадите свой дочерний класс, он будет определен напрямую. Но, как говорили другие, это не очень хорошая идея (даже если это возможно). Вы не можете документировать свои атрибуты (используя автоматический документ, например, YARD), и когда вы читаете реализацию Child, вы не видите точно, где определены атрибуты (что может привести к неправильному пониманию классов.)

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