See the Elephant

1992生まれのプログラマが書くエンジニアブログ

ポリモーフィズム、雰囲気の理解で留めてしまっていたので再勉強

qiita.com

ポリモーフィズム、雰囲気の理解で留めてしまっていたので再勉強

ポリモーフィズムとは多様性のこと

複数のクラスで同じ名前のメソッドを実装することで、同じメソッドコールに対してインスタンスの切り替えだけで振る舞いを変えることができる。

(e.g. バットを振ることはどのバッターにも共通するが、バッターが変わることで 同じ バットを振る 動作でも振る舞いや結果を変えることができる。

ポリモーフィズムは抽象クラスやインタフェースを利用することで実現できる。

interfaceの例が非常にわかりやすかったので記事から抜粋する。

interface ICharacter {
    string Attack();
}
public class Soldier : ICharacter {
    public string Attack() {
        return "戦士は斬りかかった!";
    }
}

public class Wizard : ICharacter {
    public string Attack() {
        return "魔法使いは呪文を唱えた!";
    }
}

public class Hunter : ICharacter {
    public string Attack() {
        return "狩人は矢を放った!";
    }
}
using System;
using System.Collections.Generic;

public class Program {
    static void Main() {
        var party = new List<ICharacter>() {
            new Soldier(),
            new Wizard(),
            new Hunter(),
        };
        foreach (ICharacter character in party) {
            Console.WriteLine(character.Attack());
        }
    }
}

Attack する動作は全員に共通しているが、キャラクターを変えることで振る舞いを変えることができる。

つまり、利用者側 (この例でいうMain関数) ではキャラクターそれぞれの実装を気にすることなく Attack の呼び出しだけを知っていればいい。

これがポリモーフィズムの嬉しさだろう。

www.ritolab.com

ストラテジパターンはポリモーフィズムをうまく利用したデザインパターン

似たような動作を行う異なるクラスに共通のインタフェースを提供する。

異なるクラスのインスタンスに同じインタフェースを持たせ、振る舞いだけを変える。

まさに先ほど示した Attackの例がストラテジーパターンである。

ポリモーフィズムを活用することで類似した動作を持つ異なるクラスに対して、同様の操作で異なる結果を産むことができる。