假设我有一个Media对象.
class Media < ActiveRecord::Base end
我已经在几个子类中扩展了它:
class Image < Media def show # logic end end class Video < Media def show # logic end end
从Media类中我想从正确的子类调用show的实现.所以,从媒体,如果自己是一个视频,那么它会调用视频的播放方式.如果自己是一个Image,它会调用Image的show方法.
来自Java的背景,我头脑中的第一件事就是在超类中创建一个抽象方法.但是,我在几个地方阅读过(包括Stack Overflow),抽象方法不是Ruby中处理这个问题的最好方法.
考虑到这一点,我开始了researching typecasting,发现这也是Java思维的遗迹,在处理Ruby时我需要从我的脑海中消失.
被打败了,我开始编写一些像这样的东西:
def superclass_method # logic this_media = self.type.constantize.find(self.id) this_media.show end
我一直在Ruby / Rails编写一段时间,但由于这是我第一次尝试这种行为,现有的资源没有直接回答我的问题,所以我想从更多经验丰富的开发人员获得如何完成的反馈我的任务
解决方法
>这些类型将被动态解析,所以如果在实际调用该对象的类层次结构中存在一个show,那么Ruby会找到它并调用它.欢迎您输入方法调用到将来可能存在或可能不存在的任何东西,它是合法的ruby语法,它将解析.您可以键入包含对this_will_never_be_implemented的引用的表达式,并且没有人会关心,除非它实际上被调用.
>即使在Java中,只有一个实际的对象.是的,您可能在调用方法的超类中有一个方法,但它是派生类的一个实例(以及基类的一个实例),因此您可以指望正在调用的新显示.
>从某种意义上讲,每个Ruby类都是一个抽象类,它包含了将来可能定义的每个可能的方法的存根.您可以在基类或派生类中调用任何无访问限制符的任何内容.
如果你想要一个空的超类实现,你可能需要定义一个不执行任何操作或引发异常的事情.
更新:可能的是,我应该刚刚说过“call show like any other method”并留下来,但是到目前为止我想补充说:你还可以用Ruby的多重继承版本来实现show:include SomeModule.既然你对Ruby的对象模型显然很感兴趣,那么你可以用一个mixin来实现你的属性.