LotosLabo

プログラミング技術とか気になった情報を載せていきます

Ruby言語について7

クラスについて

例:

class Car
  def initialize(carname)
    @name = carname
  end

  def dispName
    print(@name)
  end
end



オブジェクト指向でないプログラムでは行いたい処理を順に列挙していきますが、オブジェクト指向ではまず何かを行う物体の設計図を作成し、設計図から物体(オブジェクト)を作成し、その物体に処理をさせます。

クラスの定義

class クラス名
end

クラス名は大文字から始める

例:

Class Car
end


オブジェクトの作成

class クラス名
end
変数名 = クラス名.new()


例:

class Car
end
car1 = Car.new()
car2 = Car.new()



インスタンスメソッド

クラス内に記述されたメソッドはクラスから作成されたオブジェクトしか呼び出せない


class クラス名
def メソッド名(引数1, 引数2, ...)
処理
end
end

例:

class Car
  def dispString(str)
    print(str, "\n")
  end
end


インスタンスメソッドの呼び出し


例:

class Car
  def dispClassname
    print("Car class\n")
  end
  
  def dispString(str, "\n")
    print(str)
  end
end

car = Car.new
car.dispClassname
car.dispString("crown")



インスタンス変数


オブジェクトの中で値を保存しておくための利用されるのがインスタンス変数。ローカル変数をメソッド内で使用することも可能です。ただしローカル変数は一度メソッドを抜けてしまえば値は消えてしまいます。

インスタンス変数の変数名は「@」で始まります。例えば「@name」などです。ローカル変数などと同じく値が格納された時点から使用できるようになります。


class クラス名

def メソッド
@name = 値
end

end


例:

class Car
  def setName(str)
    @name = str
  end
  
  def dispName()
    print(@name, "\n")
  end
end

car = Car.new()
car.setName("crown")
car.dispName()



initializeメソッド(コンストラクタ)


このメソッドをクラス内に記述した場合にはオブジェクトが作成される時に自動的に呼び出されます。


class クラス名
def initialize()
処理
end

end



アクセスメソッド

クラスの中で使われているインスタンス変数はクラスの外からは参照したり値を変更したりすることが出来ません。参照する場合も変更したい場合もインスタンスメソッド経由して行う必要があります。

 
定義式              機能

attr_reader :変数名     参照が可能
attr_writer :変数名     更新が可能
attr_accessor :変数名   参照と更新が可能



例:

class Car
  def initialize(carname="未定義")
    @name = carname
  end
  attr_accessor :name
end


定数

定数はアルファベットの大文字で始まる定数名に対して一度だけ値を格納する事ができます。


クラス変数

クラス変数はクラスから作成された全てのオブジェクトで共有される変数となります。

クラス変数の変数名は「@@」で始まります。


class クラス名
@@name = 値
end


クラスの継承

クラスを拡張して新しいクラスを作成することが可能


class クラス名 < 継承したいクラス名
end< をつける


例:

class Car
  def accele
    print("アクセルを踏みました")
  end

  def brake
    print("ブレーキを踏みました")
  end
end

class Soarer < Car
  def openRoof
    print("ルーフを開けました")
  end
end


「Car」クラスは「Soarer」クラスのスーパークラス又は親クラスという
「Soarer」クラスは「Car」クラスのサブクラス又は子クラス


メソッドのオーバーライド


クラスの継承を利用する場合、スーパークラスで定義されたメソッドをサブクラス側で同じ名前を使ってメソッドを新しく定義しなおすことができます


例:

class Car
  def accele
    print("アクセルを踏みました")
  end

  def brake
    print("ブレーキを踏みました")
  end
end

class Soarer < Car
  def openRoof
    print("ルーフを開けました")
  end

  def accele
    print("アクセルを踏み加速しました")
  end
end



スーパークラスメソッドを呼び出す

スーパークラスメソッドを呼び出すにはオーバーライドしたメソッドの中で「super」を使って呼び出します


例:

class Car
  def accele
    print("アクセルを踏みました\n")
  end
end

class Soarer < Car
  def accele
    super
    print("加速しました\n")
  end
end