– initialize メソッドがコンストラクタになる。
class Foo
def initialize(arg)
print “Hello, ” + arg + “!”
end
end
Foo.new(“world”)
# result:
# Hello, world!
– 継承は “<"。シェルで使うような取り込むイメージ
class Parent
end
class Child < Parent
end
– 親クラスメソッド呼び出しはオーバーライドするメソッドで super とする。
class Parent
def foo(arg)
print “parent “, arg, “\n”
end
end
class Child < Parent
def foo(arg)
print “child\n”
super(arg)
end
end
Child.new.foo(“abc”)
#
# result:
# child
# parent abc
#
– メソッドのオーバーロードはできない
オーバーロードしようとすると最後の定義のみ有効になり、それ以外の呼び出しでは引数の数が違うというエラーが出る。
wrong number of arguments (1 for 0) (ArgumentError)
– 自己参照は this ではなく self
class A
attr_reader :name # 必須
def initialize
@name = “John”;
end
def foo
print self.name
end
end
A.new.foo
#
# result:
# John
self での参照はクラス外部からの参照と同等となるのでアクセス制限に注意!!
– 多重継承はモジュールに対してのみ可能
<http://www.ruby-lang.org/ja/man/?cmd=view;name=Module>
include で疑似的に実装する。
class Parent
end
module SubParent # module で宣言されていることに注意
def foo
end
end
module SubParent2 # module で宣言されていることに注意
include SubParent # module -> module の継承
def woo
end
end
class Child < Parent # class -> class の継承
include SubParent # module -> class の(多重)継承
include SubParent2 # module -> class の(多重)継承
end
ちゃんと SubParent, SubParent2 の子として認識されるのでまぁ安心して使える。
多重にするには親を module にしないとだめって事で制限があるので、 Java でいうところの interface に近い使い方になるのかな。
– 委譲 (delegate)
デリゲート用のライブラリがあった。
<http://www.ruby-lang.org/ja/man/?cmd=view;name=delegate.rb>
でもデリゲートしてるのに宣言時点で親クラスにならないとだめとか微妙なような..
include delegate(Array)
みたいな使い方ならいいのにな。