Как я должен иметь унаследованные переменные в Ruby?

#ruby #oop

#ruby #ооп

Вопрос:

Я пытаюсь достичь:

 class Model
    table = "NOT SET"
    self.get(id)
        sql = "SELECT * FROM #{table} WHERE id = #{id}
    end
end
  

Это мой общий класс модели с примером функции.

 class User < Model
    table = "users"
end
  

Я хочу сохранить общие функции sql в родительском классе, поскольку они не требуются в каждом отдельном экземпляре. Для каждого объявления класса требуется таблица, которая будет использоваться при запуске get функции.

Что касается переменных экземпляра, вы не создаете экземпляр [так в оригинале] класса для вызова get . Переменная класса является общей для классов в иерархии, так что это также не сработает.

Как я должен использовать переменные класса? Как я могу это сделать? В java у меня была бы защищенная переменная, которую каждый класс присваивает над конструктором.

Ответ №1:

Вы могли бы сделать что-то вроде этого. Возникновение серьезной ошибки в классе Model было бы дополнительным преимуществом для обеспечения table реализации в дочерних классах.

Кроме того, используя class << self синтаксис, вы можете определить частные или защищенные методы класса.

 class Model
  class << self
    def get(id)
      "SELECT * FROM #{table} WHERE id = #{id}"
    end

    private

    def table
      raise NotImplementedError
    end
  end
end

class User < Model
  class << self
    private

    def table
      "users"
    end
  end
end
  

Комментарии:

1. Я никогда об этом не думал! Очень умно и спасибо вам за решение.

2. Итак, я реализовал это, и это вроде как работает, однако теперь я понятия не имею, как справиться со случаем, когда неклассовому методу требуется доступ к табличной функции.

3. @Gibbo Каждый экземпляр может получить доступ к своему собственному классу через self.class . Таким образом, вы можете вызвать table метод вашего собственного класса через self.class.table из метода экземпляра.

4. Отлично, спасибо, мой друг, все сработало, как ожидалось. Надеюсь, я смогу извлечь из этого дополнительные уроки, которые помогут доработать мой код.