从超类调用子类方法
前言:这是在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
,它将调用Image的show方法。
来自Java背景,突然出现的第一件事是“在超类中创建一个抽象方法”。但是,我在几个地方(包括Stack Overflow)读过抽象方法不是在Ruby中处理这个问题的最佳方法。
考虑到这一点,我开始研究类型转换,并发现这也是Java思维的遗留物,在处理Ruby时我需要消除我的想法。
打败了,我开始编写看起来像这样的东西:
def superclass_method
# logic
this_media = self.type.constantize.find(self.id)
this_media.show
end
我已经在Ruby / Rails编写了一段时间了,但由于这是我第一次尝试这种行为并且现有资源没有直接回答我的问题,我想从更多经验丰富的开发人员那里获得有关如何完成的反馈我的任务。
那么,如何从Rails中的超类调用子类的方法实现?有没有比我最终(几乎)实施更好的方式?
没有找到相关结果
已邀请:
4 个回复
死搭胯
,那么Ruby将找到并调用它。欢迎您输入对将来可能存在或不存在的任何内容的方法调用,它是合法的ruby语法,它将解析。你可以输入一个包含对
的引用的表达式,除非它实际被调用,否则没有人会关心。 即使在Java中,也只有一个实际对象。是的,你可能在超类中有一个调用方法的方法,但它是派生类的一个实例(以及基类的一个实例),所以你可以指望被调用的新
。 从某种意义上说,每个Ruby类都是一个抽象类,包含可能在将来定义的每种可能方法的存根。您可以在基类或派生类中调用没有访问限定符的任何内容。 如果您想要一个null超类实现,您可能希望定义一个不执行任何操作或引发异常的实现。 更新:可能,我应该刚才说“像任何其他方法一样调用ѭ4”并将其留在那里,但是到目前为止我想补充一点:你还可以用Ruby的多重继承版本实现
:包括SomeModule。由于您显然对Ruby的对象模型感兴趣,因此您可以使用mixin实现您的属性,只是为了好玩。
荆怖赡
。然后你可以在超类中调用它,子类将调用它自己的版本,但是超类不会抛出错误。
坛沤疲撑拆
的方法中拨打
,只需这样做。但是,请确保
响应方法调用。
要避免分支,请在Media上实现
,使用*作为
的主体
凸晴
没有在
上定义。如果
是
的实例,那么任何对
的调用都将首先发送到
,无论它在何处。只有当
不存在时,呼叫才会被传递到
,即使呼叫来自
中定义的代码