目的
オブジェクト〜クラス〜インスタンスについての個人的な覚書
オブジェクトについて
オブジェクトとは日本語で「モノ・実体」を表す。
プログラミング上は「複数のデータと複数のメソッドをまとめたものと言える」
例えばContainerオブジェクトは下記のようなデータとメソッドを持つ。
オブジェクト指向におけるクラスについて
オブジェクト指向では「クラス」というオブジェクトの設計図を作成し
設計図(クラス)を元に実体(オブジェクト)を生成する。
クラス(設計図)にはそのオブジェクト(実体)が持つ「データ」とメソッドを定義する
インスタンスについて
- クラスを元に生成される実体を「インスタンス」と呼ぶ。
- インスタンスはnewメソッドを用いて「クラス名.new」で生成する。
- 「インスタンス」と「オブジェクスト」は同じ意味で使われる。
ruby
container1 = Container.new
container2 = Container.new
container3 = Container.new
インスタンスメソッド
クラス(設計図)の中で定義することによってそのクラスのインスタンス固有のメソッドを
作ることができる。
これをインスタンスメソッドという。
「インスタンス.インスタンスメソッド」でそのメソッドを呼び出すことができる。
ruby
class Container
def dry_container
puts "I am standard dry container"
end
def reefer_container
puts "I am reefer container. I can control. temperature"
end
end
container_1 = Container.new #container_1のインスタンスを生成
container_2 = Container.new #container_2のインスタンスを生成
container_1.dry_container #container_1のインスタンスメソッドの呼び出し
container_2.reefer_container#container_2のインスタンスメソッドの呼び出し
#結果
# I am standard dry container
# I am reefer container. I can control temperature.
initializeメソッド
- initializeという特別なメソッドを定義するとnewメソッドでインスタンスを生成するときに同時にこのメソッドが呼ばれる。
- newメソッドには引数を入れることができる。
インスタンス変数
- @で始まる変数をインスタンス変数と呼ぶ
- そのインスタンスの持つ固有の「データ」を表す
ruby
class Container
def initialize(origin,material,manufactured_year)
@country_of_origin = origin
@material = material
@manufactured_year = manufactured_year
end
def dry_container
puts "私はドライコンテナです。生産地は#{@country_of_origin}で材質は#{@material}で#{@manufactured_year}に生産されました"
end
def reefer_container
puts "私はリーファーコンテナです。生産地は#{@country_of_origin}で材質は#{@material}で#{@manufactured_year}に生産されました"
end
end
container_1 = Container.new("Japan","steel",2017)
container_2 = Container.new("China","aluminium" ,2000)
container_1.dry_container
container_2.reefer_container
#結果:
#私はドライコンテナです。生産地はJapanで材質はsteelで2017に生産されました
#私はリーファーコンテナです。生産地はChinaで材質はaluminiumで2000に生産されました
ゲッター(インスタンス変数の値の取得)
- インスタンス変数はクラス内にあるのでクラス外で呼び出すには以下のように"nameメソッド"を定義する必要がある。
- インスタンス変数を取得するためのメソッドを「ゲッター」と呼ぶ
ruby
class Container
def initialize (name)
@name = name
end
def name #ゲッターの定義
@name
end
end
dry_container = Container.new("ドライコンテナ")
puts dry_container.name
#結果:ドライコンテナ
attr_readerを使ってインスタンス変数を呼び出す
- attr_readerを用いると簡単にゲッターを定義できる
class Container
attr_reader :name #ゲッターの定義
def initialize (name)
@name = name
end
end
dry_container = Container.new("ドライコンテナ")
puts dry_container.name
#結果:ドライコンテナ
セッター(インスタンス変数の値を変更)
- @nameなどの値を変更する場合。クラス内からでしかできない
- クラス外からインスタンス変数の値を変更するには下記のように値をセットする
ruby
class Container
def initialize(name)
@name = name
end
def name=(value) #セッターの定義
@name = value
end
def introduction
puts "私の名前は#{@name}です"
end
end
dry_container = Container.new("ドライコンテナさん")
dry_container.name = "ドライコンテナくん"
dry_container.introduction
#結果:私の名前はドライコンテナくんです
attr_readerを使ってインスタンス変数の値を変更する
ruby
class Container
attr_writer :name
def initialize(name)
@name = name
end
def introduction
puts "私の名前は#{@name}です"
end
end
dry_container = Container.new("ドライコンテナさん")
dry_container.name = "ドライコンテナくん"
dry_container.introduction
#結果: 私の名前はドライコンテナくんです
ゲッターとセッターを同時に定義する
ruby
class Container
attr_accessor :name #ゲッター、セッターの定義
def initialize(name)
@name = name
end
end
dry_container = Container.new("ドライコンテナさん")
puts "私の名前は#{dry_container.name}だったの"
dry_container.name = "ドライコンテナくん"
puts "でもね、今は#{dry_container.name}と呼ばれるようになったんだ"
#結果:
#私の名前はドライコンテナさんだったの
#でもね、今はドライコンテナくんと呼ばれるようになったんだ
publicメソッド,privateメソッド
- クラスの外から呼び出せるメソッド: publicメソッド
- クラスの外から呼び出せないメソッド: privateメソッド
- 何も指定しない場合はpublicメソッドとなる
- privateとと宣言した以降のメソッドはprivateメソッドとなり、クラス内からでしか呼び出せない
クラスメソッド、クラス変数
インスタンス.インスタンスメソッドで呼び出すインスタンスメソッドに対し、
「クラス名.クラスメソッド」で呼び出すメソッドのことを「クラスメソッド」と呼ぶ。
インスタンス変数と関係のないメソッドを作りたいときなどに定義する
ruby
class Container
def Container.data
"これはContainerクラスのクラスメソッドです"
end
end
Container.new
puts Container.data
#結果:これはContainerクラスのクラスメソッドです
selfについて
self(クラス)
- selfは特別な式で呼び出される場所によっt意味が変わる
- class定義の直下で使用するとそのクラス名を指し示す
ruby
class Container
def self.data
"これはContainerクラスのクラスメソッドです"
end
end
Container.new
puts Container.data
#結果:これはContainerクラスのクラスメソッドです
クラス(インスタンス)
- selfはインスタンスメソッド内で使用するとそのメソッドを呼び出しているインスタンスのことを指し示す
- 他のインスタンスメソッドを呼び出したい時にselfを使う
ruby
class Container
attr_accessor :name
def initialize(name)
@name = name
end
def put_name
puts "私の名前は#{self.name}です"
end
end
dry_container = Container.new ("ドライコンテナ")
dry_container.put_name
#結果:私の名前はドライコンテナです
selfの省略
- インスタンスを表すselfは省略することができる
ruby
class Container
attr_accessor :name
def initialize(name)
@name = name
end
def put_name
puts "私の名前は#{name}です"
end
end
dry_container = Container.new ("ドライコンテナ")
dry_container.put_name
#結果:私の名前はドライコンテナです