没有继承的 Ruby 类重写

标签 ruby inheritance

我刚刚做了这个实验:

class A < Hash
  def foo
    'foo'
  end
end

class A < Hash
  def bar 
    'bar'
  end
end

到目前为止,我得到了预期的结果,第二个声明扩展了第一个声明。然而,我对此感到惊讶:

class A
  def call
    puts foo
    puts bar
  end
end

上面的代码有效,但前提是我稍后声明它。否则我会得到:

TypeError: superclass mismatch for class A

我可以假设在 Ruby 中,在确保“原始优先”声明被解析后跳过父类(super class)规范是安全的而没有副作用吗?

最佳答案

您只能在类定义的第一次出现时声明继承,因此以下变体将起作用:

  1. 当您定义了相同的类继承时:

    class A < Hash
    end
    
    class A < Hash
    end
    
  2. 当您在第二种情况下使用默认继承时,将被视为未定义继承:

    class A < Hash
    end
    
    class A
    end
    
  3. 当您在这两种情况下都使用默认继承时,默认继承是 Object 类:

    class A
    end
    
    class A
    end
    

下面不会:

  1. 当您在第一种情况下使用默认继承,然后您尝试显式重新定义它时:

    class A
    end
    
    class A < Hash
    end
    
    TypeError: superclass mismatch for class A
    
  2. 当您在第一种情况下使用指定的继承(例如 String),然后您尝试显式地重新定义它(例如 Hash) ):

    class A < String
    end
    
    class A < Hash
    end
    
    TypeError: superclass mismatch for class A
    

关于没有继承的 Ruby 类重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21483282/

相关文章:

ruby-on-rails - 在 Rails 之外使用 Rails 的 ActionView Helpers

inheritance - 是否可以在构造函数中使用this.fieldname初始化基类中的字段?

java - 封闭类型的静态嵌套子类仍然可以引用私有(private)字段成员,为什么?

c# - 覆盖/隐藏显式实现的接口(interface)方法

ruby - 删除 Sinatra 应用程序中的默认路由日志记录

ruby - 如何删除 YAML 文件顶部的 '---'?

ruby - Tmux 不会从 Cucumber 场景中运行 - 产生错误 'not a terminal'

javascript - 如何从 Rails 中删除 Turbolink

java - 根据类实例进行操作

Java - 你可以重写一个类而不调用父类构造函数吗?