前言:这是在Rails应用程序的上下文中.然而,问题是Ruby特有的.
假设我有一个Media
对象.
class Media < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
我在几个子类中扩展了它:
class Image < Media
def show
# logic
end
end
class Video < Media
def show
# logic
end
end
Run Code Online (Sandbox Code Playgroud)
从Media
类中,我想show
从适当的子类调用实现.所以,从Media,如果self
是a Video
,那么它将调用Video的show方法.如果self
是一个Image
,它将调用Image的show方法.
来自Java背景,突然出现的第一件事是"在超类中创建一个抽象方法".但是,我在几个地方(包括Stack Overflow)读过抽象方法不是在Ruby中处理这个问题的最佳方法.
考虑到这一点,我开始研究类型转换,并发现这也是Java思维的遗留物,在处理Ruby时我需要消除我的想法.
打败了,我开始编写看起来像这样的东西:
def superclass_method
# logic
this_media = self.type.constantize.find(self.id)
this_media.show
end
Run Code Online (Sandbox Code Playgroud)
我已经在Ruby/Rails编写了一段时间了,但由于这是我第一次尝试这种行为并且现有资源没有直接回答我的问题,我想从更多经验丰富的开发人员那里获得有关如何完成的反馈我的任务.
那么,如何从Rails中的超类调用子类的方法实现?有没有比我最终(几乎)实施更好的方式?