🦁

継承から委譲へ (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