基本はスーパークラスは一つだけ
>Rubyの継承は単一継承
です。つまり、継承できるスーパークラスは一つだけになります(ただし、Rubyはミックスインという多重継承に似た機能を持っています。
継承関係の頂点のクラス
継承関係の頂点にいるのはBasicObjectクラス
です。それをObjectクラスが継承しています。StringクラスやArrayクラスといったこれまでに説明してきた代表的なクラスは、全てObjectクラスを継承しています。
継承されていることを観察する
irb(main):001* class User
irb(main):002> end
=> nil
irb(main):003> user = User.new
=> #<User:0x000000010d0c5ec8>
irb(main):004> user.to_s
=> "#<User:0x000000010d0c5ec8>"
irb(main):005> user.nil?
=> false
irb(main):006> User.superclass
=> Object
Userクラスのオブジェクトはto_sメソッドやnil?メソッドを呼び出すことができます。
...
これはUserクラスがObjectクラスを継承しているためです
- objectクラスを継承していることがわかる
irb(main):007> user.methods.sort
=>
[:!,
:!=,
:!~,
:<=>,
:==,
:===,
:=~,
:__id__,
:__send__,
:class,
:clone,
:define_singleton_method,
:display,
:dup,
:enum_for,
...
Objectクラスから継承したメソッドの一覧を確認
インスタンスのクラスを調べる
irb(main):008> user.class
=> User
irb(main):010> user.instance_of?(User)
=> true
irb(main):011> user.instance_of?(String)
=> false
- インスタンスのクラスを調べられる
- Userクラスかどうかを確認できる
irb(main):012> user.is_a?(User)
=> true
irb(main):013> user.is_a?(Object)
=> true
irb(main):014> user.is_a?(BasicObject)
=> true
irb(main):015> user.is_a?(String)
=> false
- is_aの関係にあるかどうかも調べられる
クラスを継承させる
irb(main):001* class Product
irb(main):002> end
=> nil
irb(main):003* class DVD < Product
irb(main):004> end
=> nil
irb(main):005> dvd = DVD.new
=> #<DVD:0x0000000113d35ba8>
irb(main):006> dvd.is_a?(DVD)
=> true
irb(main):007> dvd.is_a?(Product)
=> true
-
DVD < Product
と書くと親子関係になる
Ruby on Rails APIで確かめてみる
ActionDispatch::AssertionResponse < Object
objectクラスがスーパークラスなのがわかる