Предисловие: это в контексте приложения 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? Есть ли лучший способ, чем то, что я закончил (почти) реализацию?