加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 从超类调用子类方法

发布时间:2020-12-16 20:41:30 所属栏目:百科 来源:网络整理
导读:前言:这是在Rails应用程序的上下文中.但是,这个问题是针对Ruby的. 假设我有一个Media对象. class Media ActiveRecord::Baseend 我已经在几个子类中扩展了它: class Image Media def show # logic endendclass Video Media def show # logic end end 从Medi
前言:这是在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的引用的表达式,并且没有人会关心,除非它实际上被调用.
>即使在Java中,只有一个实际的对象.是的,您可能在调用方法的超类中有一个方法,但它是派生类的一个实例(以及基类的一个实例),因此您可以指望正在调用的新显示.
>从某种意义上讲,每个Ruby类都是一个抽象类,它包含了将来可能定义的每个可能的方法的存根.您可以在基类或派生类中调用任何无访问限制符的任何内容.

如果你想要一个空的超类实现,你可能需要定义一个不执行任何操作或引发异常的事情.

更新:可能的是,我应该刚刚说过“call show like any other method”并留下来,但是到目前为止我想补充说:你还可以用Ruby的多重继承版本来实现show:include SomeModule.既然你对Ruby的对象模型显然很感兴趣,那么你可以用一个mixin来实现你的属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读