#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. Отлично, спасибо, мой друг, все сработало, как ожидалось. Надеюсь, я смогу извлечь из этого дополнительные уроки, которые помогут доработать мой код.