ruby – 从超类调用子类方法
前言:这是在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的实现.所以,从媒体,如果自己是一个视频,那么它会调用视频的播放方式.如果自己是一个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编写一段时间,但由于这是我第一次尝试这种行为,现有的资源没有直接回答我的问题,所以我想从更多经验丰富的开发人员获得如何完成的反馈我的任务 那么,如何从Rails的超类调用一个子类的方法的实现?有没有比最终的(几乎)实施更好的方法? 解决方法
很好的问题,但你使它太复杂了.记住几个原则,应该是清楚的
>这些类型将被动态解析,所以如果在实际调用该对象的类层次结构中存在一个show,那么Ruby会找到它并调用它.欢迎您输入方法调用到将来可能存在或可能不存在的任何东西,它是合法的ruby语法,它将解析.您可以键入包含对this_will_never_be_implemented的引用的表达式,并且没有人会关心,除非它实际上被调用. 如果你想要一个空的超类实现,你可能需要定义一个不执行任何操作或引发异常的事情. 更新:可能的是,我应该刚刚说过“call show like any other method”并留下来,但是到目前为止我想补充说:你还可以用Ruby的多重继承版本来实现show:include SomeModule.既然你对Ruby的对象模型显然很感兴趣,那么你可以用一个mixin来实现你的属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |