Ruby 基类像抽象类一样调用子类

标签 ruby oop inheritance

在Java中,我习惯于编写一个抽象类来完成一些设置工作,然后委托(delegate)给具体类,如下所示:

public abstract class Base {
    public void process() {
        // do some setup
        //...

        // then call the concrete class
        doRealProcessing();
    }
     
    protected abstract void doRealProcessing();
}

public class Child extends Base {
    @Override
    protected void doRealProcessing() {
        // do the real processing
    } 
}

我在 Ruby 中很难做到这一点,因为我没有抽象类或方法。我还读到“你不应该需要 Ruby 中的抽象类或方法,我应该停止尝试用 Ruby 编写 Java”。

我很想知道在 Ruby 中实现等价的正确方法是什么?

最佳答案

欢迎使用动态类型语言!您可能会对定义一些未在任何地方声明的函数感到紧张。别担心。这很容易:

class Base
  def process
     # ...
     real_processing
  end

  def real_processing    # This method is optional!
    raise "real_processing not implemented in #{self.class.name}"
  end
end

class Child < Base
   def real_processing
     # ...
   end
end

b = Child.new
b.process

编辑:这是另一个选项,可以避免使用两个不同的方法名称:

class Base
  def process
    # ...
  end
end

class Child < Base
  def process
    # ...
    super   # calls the process method defined above in Base
    # ...
  end
end

关于Ruby 基类像抽象类一样调用子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12873873/

相关文章:

ruby - 在 Ruby 中不是对象的 'Things' 示例

c# - 为什么这个 Upcast 不起作用?

java - LinkedHashMap 的子类作为缓存

ruby - #<无方法错误: undefined method `any?' for nil:NilClass>

ruby - 为 Ruby 推荐的双向加密 gem?

ruby-on-rails - Ruby 中的 Nil 和 bool 值

c++ - 尝试将对象用作类的属性时出错

javascript - 访问父类中的变量

javascript - 创建原型(prototype)链最安全、跨浏览器广泛支持的方法是什么?

ruby - 如何临时更改 Ruby 中的 require 路径($ :)?