Ruby中的类层次结构

时间:2014-08-29 12:42:49

标签: ruby

我已经深入了解Ruby层次结构以理解它。例如,

class Test
end

t = Test.new

所以,如果我想上课,我需要上课#39;属性:

t.class # 'Test'

如果我想获得Test class的父级,我应该使用' superclass'方法:

t.class.superclass # BasicObject

但Test也是Class类的一个实例。所以,如果我执行以下内容:

t.class.class # Class

所以,我不明白超级'之间的区别。和' class.class&#39 ;;为什么不是Test的超类?这是什么意思? Doest Test继承Class或BasicObject或两者的方法?请向我解释这个问题。我来自Java,之前我没有听说过这些功能。谢谢。

3 个答案:

答案 0 :(得分:1)

每个对象都响应class。它说对象是实例的对象是什么类。

只有课程才会回复superclass。它说该类是子类的类。

Foo = Class.new # class Foo; end
foo = Foo.new

Foo.class # Class
foo.class # Foo

Bar = Class.new(Foo) # class Bar < Foo; end
Bar.class # Class
Bar.superclass # Foo

所有类都是Class的实例。 Ruby 不允许类的子类。

答案 1 :(得分:0)

首先,默认情况下,您定义的类的隐式超类是Object,而不是BasicObject。 现在,Test.superclass方法返回Test直接继承的类。虽然Test.class返回Test实例的类。请记住,Ruby中的类也是对象,Ruby中的所有对象都属于某个类。

答案 2 :(得分:0)

所有对象都是Object类的后代。类也是对象,它是Object的一个实例,看起来有点奇怪。

    class Test
    end

    Test.class # => Class
    Test.superclass # => Object
    Object.class # => Class
    Class.superclass # => Module
    Module.class # => Class
    Module.superclass # => Object
    Object.superclass # => BasicObject

Object类的所有后代都继承了很多方法,比如clone,dup,freeze和许多其他方法。另一方面,BasicObject几乎不提供任何方法 - 它甚至不提供方法:methods和public_methods。