Предисловие: это в контексте приложения Rails. Вопрос, однако, специфичен для Ruby.
Скажем, у меня есть объект Media
.
class Media < ActiveRecord::Base
end
Я расширил его в нескольких подклассах:
class Image < Media
def show
# logic
end
end
class Video < Media
def show
# logic
end
end
Из класса Media
я хочу вызвать реализацию show
из соответствующего подкласса. Итак, из Media, если self
является Video
, тогда он будет вызывать метод Video show. Если self
вместо этого Image
, он будет вызывать метод отображения изображения.
Исходя из фона Java, первое, что появилось в моей голове, было "создать абстрактный метод в суперклассе". Тем не менее, я читал в нескольких местах (в том числе Stack Overflow), что абстрактные методы - это не лучший способ справиться с этим в Ruby.
С учетом этого, я начал исследование typecasting и обнаружил, что это также реликвия Java-мышления, которую мне нужно изгнать из моего разума при работе с Ruby.
Пораженный, я начал кодировать что-то похожее на это:
def superclass_method
# logic
this_media = self.type.constantize.find(self.id)
this_media.show
end
Я уже некоторое время программировал в Ruby/Rails, но так как это был мой первый раз, пытающийся выполнить это поведение, и существующие ресурсы не отвечали на мой вопрос напрямую, я хотел получить обратную связь от более опытных разработчиков на как выполнить мою задачу.
Итак, как я могу назвать реализацию подкласса метода из суперкласса в Rails? Есть ли лучший способ, чем то, что я закончил (почти) реализацию?