Ruby 子类不继承父方法或无法调用类主体中的父方法

标签 ruby inheritance

我正在制作一个页面对象。

require 'watir-webdriver'

class Page

  attr_accessor :driver

  def initialize
    @driver = Watir::Browser.new :phantomjs
    @driver.goto(some_arbitrary_url)
  end

  def element(**attrs)
    @driver.element( id: attrs[:id], tag_name: attrs[:tag_name])
  end

  def elements(**attrs)
    @driver.elements( class: attrs[:class], tag_name: attrs[:tag_name])
  end

end

然而,当我将 Page 类子类化时,我不能在类主体中使用它的 element 方法,除非我将它们放在一个方法中,如下所示:

class Home < Page

  #throws NoMethodError: undefined method 'element' for Home:Class
  some_element = element(id: 'elements_id')

  #works
  def some_arbitrary_element
    element(id: 'elements_id')
  end

end

到目前为止,我只是在修补,我已经尝试过 protected: element, elements 以及 self.element(...) 都无济于事。发生什么了?我没有在 Matz 的 Ruby 书中阅读任何关于方法继承的启发性内容,而且通常 Ruby 是如此不足为奇,所以我很难确定问题到底出在哪里。

最佳答案

您正在调用元素,就好像它被定义为类方法一样。任何在类定义中但不在方法定义中的代码都只能调用类方法。使该方法从调用它的地方可见的一种方法是更改​​签名,使其成为类对象的方法。

class Page
  def self.element
  end
end

关于Ruby 子类不继承父方法或无法调用类主体中的父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166530/

相关文章:

ruby-on-rails - 我怎样才能对模型中的长度验证做一个 if else 语句

java - 如何在java中继续使用泛型

c# - 有类之类的东西可以实现吗?

c# - 您将如何在 Ruby 中简洁地编写此 C# 代码(使用 yield 关键字)?

ruby - 如何在 ActiveAdmin 的显示 View 中隐藏编辑和删除操作?

java - 在 Java 中访问 super() 类的私有(private)变量 - JChart2D

java - 父类和实现的接口(interface)具有相同名称的字段,并且仅在一个类差异内

c++ - 通过使用范围解析避免多重继承引起的歧义

ruby - 在两个 Ruby 脚本之间交换消息

ruby-on-rails - 在 RSpec 的请求规范中发送授权 header 时出错