4.クラスとインスタンス
1.オブジェクト
RGSS2で使用されるすべての値は、オブジェクトです。
このオブジェクトを使用してプログラムを構成します。
オブジェクトに対して行える操作は、メソッドの呼び出しのみで、
そのメソッドは、そのオブジェクトが所属するクラスによって決まります。
このオブジェクトをインスタンスともいいます。
2.クラス
クラスは、オブジェクトの設計図みたいなものです。
クラスには、データ(インスタンスの保持する変数・定数)と操作(メソッド)が定義されています。
すべてのオブジェクトは、このクラスから作られます。

設計図(クラス)から製品(オブジェクト)を作るイメージです。
設計図のままだと何もできませんが、製品にすると実際に使用することができます。

クラスの定義は、classを使用して定義します。
このとき、クラス名に指定された定数が定義されていなければ、
その定数を作成しクラスオブジェクトを代入します。
既に定義されていた場合は、そのクラスに定義を追加します。
もし、同名のメソッドが既に定義されていれば新しいものに置き換えます。
# 新クラスの定義
class Hoge
  def aaa
    "xxx"
  end
end
# メソッドの上書き
class Hoge
  # 古いメソッドは消える
  def aaa
    "aaa"
  end
end
# 追加定義
class Hoge
  # 既にある Hoge クラスに bbb メソッドを加える
  def bbb
    "bbb"
  end
end

h = Hoge.new
p h.aaa   # => "aaa"
p h.bbb   # => "bbb"
3.コンストラクタ
コンストラクタは、オブジェクトの初期化を行うためのメソッドです。
このメソッドは、インスタンスの作成時に自動で呼び出されます。
クラスメソッド new の引数を受け取って処理させることができます。

クラスメソッド new の戻り値は、作成されたインスタンスです。
コンストラクタ initialize の戻り値は無視されます。
class Hoge
  def initialize(arg)
    p arg
    return "ほげ"
  end
end
p Hoge.new(123)  # => 123
                      #<Hoge:0x288f700>
4.継承
継承とは、あるクラスを基に新しいクラスを作る事です。
継承によって作られたクラスは、基のクラスのメソッドなどを引き継ぎます。

Foo クラスを継承した Bar クラスを作成した例です。
このとき、Foo クラスは Bar クラスのスーパークラスといいます。
逆に Bar クラスは Foo クラスのサブクラスといいます。
class Foo
  def method
    p "Foo#method"
  end
end
class Bar < Foo
end

# スーパークラスのメソッドを引き継ぐ
Bar.new.method  # => "Foo#method"
サブクラスは、スーパークラスのメソッドを引き継ぐのでこのようにメソッドを呼び出せます。
5.super
スーパークラスで定義されているメソッドをサブクラスで再定義することをオーバーライドと呼びます。
# 追加定義
class Bar < Foo
  # オーバーライド
  def method
    p "Bar#method"
  end
end
Bar.new.method  # => "Bar#method"

オーバーライドするとき、完全に置き換える必要がなく新しいコードを追加して動作を補いたいときは、
superを使用することでスーパークラスのメソッドを呼び出すことが可能です。

super は、メソッドのように使用できますが、少し特殊で引数や括弧をつけずに使用すると、
現在のメソッドに渡されたすべての引数をスーパークラスのメソッドに渡します。
もし、引数を1つも指定せずに実行したい場合は、空の括弧を使用する必要があります。

また、渡される引数は super が実行された時点での値ですので、
直前に引数変数の値を変更すれば、その変更された引数を渡すことになります。
class Foo
  def initialize(*args)
    p args
  end
end

class Bar < Foo
  def initialize(a, b, c)
    super
    super()
    a = b = c
    super
  end
end

Bar.new(1, 2, 3)  # => [1, 2, 3] と [] と [3, 3, 3]
7.今回のポイント
・クラスとは、データや処理をまとめたものである。
・クラス自体には実体がなく、new メソッドにより実体化して使用する。
・インスタンスが作られると、自動で initialize メソッドが呼び出される。
・継承とは、あるクラスを基に新しいクラスを作る事である。
・継承後は親クラスのメソッドが使用できる。
・オーバーライドしても、super メソッドで親クラスのメソッドを呼び出せる。