基本形
クラスの基本形は以下の通り。
- クラス定義は
class
で始めてend
で終える - メソッドは
def
で初めてend
で終える - 初期化メソッド(コンストラクター)は
'initialize()'
- プロパティー(インスタンス変数)は頭に
'@'
をつけて、initialise()
で定義 - インスタンスの生成は
[クラス名].new([引数])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class MyClass def initialize(val) @property = val end def method(val) return @property + val end end instance = MyClass.new(2) puts instance.method(5) # 7 |
initialize()~コンストラクター
インスタンス生成時の初期化処理をinitialize()
に書く(コンストラクター)。インスタンス生成時にinitialize()
が内部で実行され、その内容に沿った初期化が行われる(initialize()
についてはこちら)。
メソッド
インスタンスメソッドはdef...end
で定義する。引数を持たないメソッドの場合、()
を省略してメソッド名だけで呼び出せる(これはnew
についてもあてはまる)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Rectangle def initialize(side1, side2) @side1 = side1 @side2 = side2 end def area() return @side1 * @side2 end def perimeter() return (@side1 + @side2) * 2 end end rect = Rectangle.new(3, 5) puts rect.perimeter() puts rect.area |
インスタンス変数へのアクセス
インスタンス変数はカプセル化(encapsulation、隠蔽)されている。参照したり値をセットしようとするとエラー。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MyClass def initialize() @a = 0 end end instance = MyClass.new puts instance.@a # ERROR # syntax error, unexpected tIVAR instance.a = 1 # ERROR # in `<main>': undefined method `a=' for #<MyClass:0x00000000050d53e0 @a=0> (NoMethodError) |
インスタンス変数にアクセスするのにアクセスメソッドによる方法とgetter/setterを定義する方法がある。
クラス変数・クラスメソッド
クラス変数は、クラスから生成された全インスタンスが共通して利用する変数。
クラスメソッドはクラスレベルで定義されるメソッド。
クラスの継承
継承は'<'
を使う。クラスの継承の詳細についてはこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class ParentClass def initialize() @parent_property = "parent property" end def parent_method() puts "in parent" end end class ChildClass < ParentClass def child_method() puts "in child" puts "#{@parent_property} accessible" end end child = ChildClass.new child.parent_method child.child_method # in parent # in child # parent property accessible |