🦁
継承から委譲へ (ruby)
ポリモーフィズムの弊害
ポリモーフィズムの利点をいやというほど最近見ているが、弊害もある。
実際、継承の時点で依存関係が強くなってしまうし、いいことばかりではない。
近日まで、どうすれば共通の処理以外の特有のメソッドをうまく影響範囲を狭めて実行できないかと悩んでいたが、正解を見つけた。
具体例
まずは、共通のアクションを行う。
こちらは、具象クラスでオーバーライドしないとエラーが起きるように設定しておく。
# === 共通のインターフェース ===
class Animal
def speak
raise NotImplementedError
end
def move
raise NotImplementedError
end
end
ここで固有のアクションをクラスで定義する。
class UniqueAction
def fly
"大空を羽ばたく!"
end
end
それぞれの動物の具体的なふるまいである。
# === 動物ごとのクラス(ポリモーフィズム+委譲) ===
class Dog < Animal
def initialize
@action = DogAction.new
end
def speak
"ワン!"
end
def move
"駆け回る!"
end
end
class Cat < Animal
def initialize
@action = CatAction.new
end
def speak
"ニャー!"
end
def move
"静かに歩く"
end
end
class Bird < Animal
def initialize
@action = BirdAction.new
@unique_action = UniqueAction
end
def speak
"チュンチュン!"
end
def move
"動く!"
end
def fly
@unique_action.fly
end
end
注目すべきは、flyアクションをインスタンスで呼び出しているところである。
これにより、ほかの継承先には影響を出さずに、固有のアクションを持たせられる。
結果
個別でclassを作り、インスタンスで呼び出そう!!
また一つ、学びが増えた。
Discussion