gpt4 book ai didi

ruby-on-rails - 从父类(super class)调用子类方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:07 27 4
gpt4 key购买 nike

前言:这是在 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 方法。如果 selfImage,它将调用 Image 的 show 方法。

我有 Java 背景,首先想到的是“在父类(super class)中创建一个抽象方法”。但是,我在多个地方(包括 Stack Overflow)读到抽象方法并不是在 Ruby 中处理此问题的最佳方式。

考虑到这一点,我开始了 researching typecasting并发现这也是我在处理 Ruby 时需要摒弃的 Java 思想遗留问题。

失败后,我开始编写如下所示的代码:

def superclass_method
# logic
this_media = self.type.constantize.find(self.id)
this_media.show
end

我用 Ruby/Rails 编写代码已经有一段时间了,但由于这是我第一次尝试这种行为并且现有资源没有直接回答我的问题,我想从经验丰富的开发人员那里获得反馈如何完成我的任务。

那么,我如何在 Rails 中调用父类(super class)方法的子类实现?有没有比我最终(几乎)实现的更好的方法?

最佳答案

问得好,但你把它弄得太复杂了。牢记一些原则,一切都应该很清楚……

  • 类型将被动态解析,因此如果 show 存在于对象类层次结构中的任何地方此时它实际上被调用 em> 然后 Ruby 会找到它并调用它。欢迎您输入对 future 可能存在或不存在的任何内容的方法调用,它是合法的 ruby​​ 语法,它将被解析。您可以输入包含对 this_will_never_be_implemented 的引用的表达式,除非它实际被调用,否则没人会关心。

  • 即使在 Java 中,也只有一个实际对象。是的,您可能在父类(super class)中有一个调用方法的方法,但它派生类的实例(以及基类的实例),因此您可以指望新的show 被调用。

  • 从某种意义上说,每个 Ruby 类都是一个抽象类,其中包含 future 可能定义的每个可能方法的 stub 。您可以调用基类或派生类中没有访问限定符的任何内容。

如果您想要一个空的父类(super class)实现,您可能想要定义一个什么也不做或引发异常的实现。

更新: 可能我应该只是说“像调用任何其他方法一样调用 show”然后就此打住,但说到这里我想补充一点:您还可以使用 Ruby 版本的多重继承来实现 show:include SomeModule。由于您显然对 Ruby 的对象模型感兴趣,您可能会为了好玩而使用 mixin 实现您的属性。

关于ruby-on-rails - 从父类(super class)调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4846021/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com