クラス

概要

  • クラスは、オブジェクトを構成するデータ変数と、それを操作するためのメソッドをまとめたものです。

クラスの定義方法

  • クラス定義の記載方法は以下のようになります。
    class クラス名 : スーパークラス名
      クラスメソッド定義
      インスタンスメソッド定義
      クラス変数定義
      インスタンス変数定義
      コンストラクタ定義
    end
    
  • 先頭の ": スーパークラス名"は省略可能です。
    • 省略した場合、内部定義クラスの Object クラスがスーパークラスとなります。
  • スクリプト内の記載時点で未定義のクラスをスーパークラスとして指定することはできません。
  • クラス宣言内の、メソッド定義、変数定義の定義は順不同で記載できます。
  • クラスが宣言された時点で、そのクラスの静的インスタンスが自動的に生成されます。
    • 静的変数の初期値もこの時点で設定されます。
      class SuperClass
        @@value = 0
        @val0 = 1
        @val1 = 2
        def method_1( )
        end
      end
      
      class MyClass
        @val2 = 3
        def method_1( )
        end
        def method_2( )
        end
      end  
      

コンストラクタ

  • コンストラクタは、クラスのインスタンスが生成された際にインタプリタが自動的に呼び出す特別なメソッドです。
    • コンストラクタのメソッド名は "initialize" 固定です。
    • コンストラクタも通常メソッドと同様、引数を持つことが可能です。
    • 文法上はreturn で戻り値を返すことも可能ですが、意味を持ちません。
      • 戻り値として返した値は破棄されます。
class MyClass
  def initialize( a, b, c )
  end
end

クラスの宣言(インスタンス生成)方法

  • クラスのインスタンスを生成するには、以下の構文を使用します。
    オブジェクトを記憶する変数 = クラス名.new( コンストラクタに渡すArgument )
    
  • new が呼び出されると以下の順序でクラス宣言処理が行われます。
    • 宣言されたクラス内の変数、メソッドのメモリ確保、定義位置に記載されている初期値の代入
      • 変数の初期値の代入順序は不定です。
      • ある変数の初期値代入時に、他の変数が初期化されていることを想定してはいけません。
    • 宣言されたクラスのスーパークラスの変数、メソッドのメモリ確保、定義位置に記載されている初期値の代入
    • 最上位のスーパークラス(Object)まで同様の処理を繰り返します。
    • 宣言されたクラスのコンストラクタ(initializeメソッド)の呼び出し。
      • C++等と異なり、スーパークラスのコンストラクタは自動的に呼び出されません。
      • 次節に記載する、super( ) を使用し、明示的に呼び出す必要があります。
        class MyClass
          def initialize( a, b, c )
          end
        end
        p = MyClass.new( 1, 2, 3 )
        

スーパークラスの同名メソッドの呼び出し

  • 現在のインスタンスのスーパークラスで定義されている同名メソッドを呼び出すために、特別なメソッド super( )を使用することができます。
  • 直前のスーパークラスに同名メソッドが定義されていない場合、最上位のクラス方向にメソッド探索を行います。
  • 同名メソッドが見つからない場合例外となります。
    class SuperClass
      def initialize( a )
      end
    end
    
    class MyClass : SuperClass
      def initialize( a, b, c )
        super( a )
      end
    end
    p = MyClass.new( 1, 2, 3 )
    

スーパークラスの変数、メソッドを参照する

  • サブクラスとスーパークラスで同名メソッド、変数が定義されている際、以下のように記載することでスーパークラスのデータにアクセスできます。
    対象クラス.super.@スーパークラスの変数
    対象クラス.super.@スーパークラスのメソッド(Argument...)
    
  • この仕組は一時的にスーパークラスを参照すための手段として提供されているだけです。、
  • 以下のようなコードを記載しても、スーパークラスのインスタンスを取り出す事はできません。
    superClassInstance = myClassInstance.super
    Console.println( superClassInstance) # => #<MyClass:instance>