2005年03月28日

ダブルディスパッチ

   このエントリーをはてなブックマークに追加 Clip to Evernote
ダブルディスパッチのサンプルとして、じゃんけんクラスを作ってみました。

public enum JyankenResult { Win, Lose, Draw }

public abstract class JyankenHand {
public abstract JyankenResult Fight(JyankenHand oponent);
public abstract JyankenResult FromChoki(Choki oponent);
public abstract JyankenResult FromGoo(Goo oponent);
public abstract JyankenResult FromPaa(Paa oponent) ;
}

public class Goo :JyankenHand {
public override JyankenResult Fight(JyankenHand hand) {
return hand.FromGoo(this);
}

public override JyankenResult FromChoki(Choki oponent) {
return JyankenResult.Lose;
}

public override JyankenResult FromGoo(Goo oponent) {
return JyankenResult.Draw;
}

public override JyankenResult FromPaa(Paa oponent) {
return JyankenResult.Win;
}

public override string ToString() {
return "グー";
}
}

public class Choki: JyankenHand {
public override JyankenResult Fight(JyankenHand hand) {
return hand.FromChoki(this);
}

public override JyankenResult FromChoki(Choki oponent) {
return JyankenResult.Draw;
}

public override JyankenResult FromGoo(Goo oponent) {
return JyankenResult.Win;
}

public override JyankenResult FromPaa(Paa oponent) {
return JyankenResult.Lose;
}

public override string ToString() {
return "チョキ";
}
}

public class Paa : JyankenHand {
public override JyankenResult Fight(JyankenHand hand) {
return hand.FromPaa(this);
}

public override JyankenResult FromChoki(Choki oponent) {
return JyankenResult.Win;
}

public override JyankenResult FromGoo(Goo oponent) {
return JyankenResult.Win;
}

public override JyankenResult FromPaa(Paa oponent) {
return JyankenResult.Lose;
}

public override string ToString() {
return "パー";
}
}

使い方はこんな感じ。
JyankenHand h1 = new Goo();
JyankenHand h2 = new Choki();
JyankenResult r = h1.Fight(h2);

if文が無いのに比較できるって、面白いですね。


この記事へのコメント
class Paaがバグっていました。すみません。
どこが間違っているのかは、皆さんで探してください (^^;
Posted by gushwell at 2005年03月29日 22:07
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/17439281