Rubyでオブジェクト指向
クラス
クラス変数
コンストラクタ
クラスメソッド
インスタンス
インスタンス変数
インスタンスメソッド
継承
モジュール
ダックタイピング
コンポジション
code:ruby
# 人類
class Human
# クラス変数
# 絶滅しているか?
@@isExtinction = false
# コンストラクタ
def initialize(name, sex, isAlive)
# インスタンス変数
@name = name
@sex = sex
@isAlive = isAlive
@lastEjeclatedBy = nil
end
# クラスメソッド
def self.getIsExtinction
@@isExtinction
end
# インスタンスメソッド
def getName
@name
end
def getSex
@sex
end
def getIsAlive
@isAlive
end
def getLastEjaclatedBy
@lastEjaclatedBy
end
end
# 人類は絶滅しているか?
puts Human.getIsExtinction
# 男性(人類を継承する)
class Male < Human
def initialize(name, isAlive)
super(name, 'male', isAlive)
@lastEjeclatedTo = nil
end
# 射精する
def ejaculation(human)
# 最後に射精した相手を覚えておく
@lastEjaclatedTo = human
human.lastEjaclatedBy = self
# 受精できる相手だったら受精させる
human.fertilization(human) if human.class.instance_methods(false).include?(:fertilization)
end
# 最後に射精した相手を取得する
def getLastEjaclatedTo
@lastEjaclatedTo
end
end
# 女性(人類を継承する)
class Female < Human
def initialize(name, isAlive)
super(name, 'female', isAlive)
@isFertilized = false
@lastFertilizedBy = nil
end
# 受精する
def fertilization(human)
@lastEjaclatedBy = human
@isFertilized = true if @isAlive
@lastFertilizedBy = human if @isAlive
end
def getIsFertilized
@isFertilized
end
def getLastFertilizedBy
@lastFertilizedBy
end
end
# 男性を生成
male = Male.new('a male', true)
puts male.getName
puts male.getSex
puts male.getIsAlive
# 女性を生成
female = Female.new('a female', true)
puts female.getName
puts female.getSex
puts female.getIsAlive
# 男性から女性に射精
male.ejaculation(female)
puts male.getLastEjaclatedTo # => female
puts femae.getLastEjaclatedBy # => male
puts female.getIsFertilized # => true
puts female.getLastFertilizedBy # => male
# 男性から男性に射精
# 別の男性を生成
male_ = Male.new('other male', true)
male.ejeculation(male_)
puts male.getLastEjaculatedTo # => male_
puts male_.getLastEjeculatedBy # => male
# 男性から女性(死体)に射精
# 別の女性を生成
female_ = Female.new('dead female', false)
male.ejeclation(female_)
puts female_.getIsFertilized # => false