Created
October 17, 2013 09:08
-
-
Save goldeneggg/7021663 to your computer and use it in GitHub Desktop.
Scalaのトレイトで馬(と陸上走者)を表現してみた
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package tmp | |
trait Sex {def getSex: String} | |
trait Male extends Sex {def getSex = "牡"} | |
trait Female extends Sex {def getSex = "牝"} | |
trait Distance {def getDistance: String} | |
trait Sprinter extends Distance {def getDistance = "短距離"} | |
trait Middler extends Distance {def getDistance = "中距離"} | |
trait Stayer extends Distance {def getDistance = "長距離"} | |
trait RunType {def getRunType: String} | |
trait Nige extends RunType {def getRunType = "逃げ"} | |
trait Senkou extends RunType {def getRunType = "先行"} | |
trait Sashi extends RunType {def getRunType = "差し"} | |
trait Oikomi extends RunType {def getRunType = "追込"} | |
trait Kyokutan extends RunType { | |
abstract override def getRunType = "大" + super.getRunType | |
} | |
trait SpecialName {def getSpecialName: String} | |
trait Medalist {def getMedalName: String} // XXX Runnerクラス内が適切? | |
abstract class Horse extends Sex with Distance with RunType {def getName: String} | |
abstract class SpecialHorse extends Horse with SpecialName {def getGICount: Int} | |
class NaritaBrian extends SpecialHorse with Male with Stayer with Sashi { | |
def getName = "ナリタブライアン" | |
def getGICount = 5 | |
def getSpecialName = "シャドーロールの怪物" | |
} | |
class SilenceSuzuka extends SpecialHorse with Male with Middler with Nige with Kyokutan { | |
def getName = "サイレンススズカ" | |
def getGICount = 1 | |
def getSpecialName = "ススズ" | |
} | |
class SakuraChitoseoh extends SpecialHorse with Male with Middler with Oikomi with Kyokutan { | |
def getName = "サクラチトセオー" | |
def getGICount = 1 | |
def getSpecialName = "太氏ね" | |
} | |
class HaruUrara extends Horse with Female with Sprinter with Senkou { | |
def getName = "ハルウララ" | |
} | |
abstract class Runner extends Sex with Distance with RunType {def getName: String} | |
class NaokoTakahashi extends Runner with Female with Stayer with Sashi with SpecialName with Medalist { | |
def getName = "高橋尚子" | |
def getSpecialName = "Qちゃん" | |
def getMedalName = "金" | |
} | |
class UsainBolt extends Runner with Male with Sprinter with Senkou with SpecialName with Medalist { | |
def getName = "ウサインボルト" | |
def getSpecialName = "ライトニングボルト" | |
def getMedalName = "金" | |
} | |
object TraitSample { | |
def main(args: Array[String]) { | |
debugHorse(new NaritaBrian) | |
debugHorse(new SilenceSuzuka) | |
debugHorse(new SakuraChitoseoh) | |
debugHorse(new HaruUrara) | |
debugRunner(new NaokoTakahashi) | |
debugRunner(new UsainBolt) | |
debugRunner(new UsainBolt with Kyokutan) | |
} | |
private def debugHorse(horse: Horse) { | |
println("==========") | |
println(horse.getName) | |
println(horse.getSex) | |
println(horse.getDistance) | |
println(horse.getRunType) | |
if (horse.isInstanceOf[SpecialHorse]) { | |
val sh: SpecialHorse = horse.asInstanceOf[SpecialHorse] | |
println(sh.getSpecialName) | |
println(sh.getGICount) | |
} | |
} | |
private def debugRunner(runner: Runner) { | |
println("==========") | |
println(runner.getName) | |
println(runner.getSex) | |
println(runner.getDistance) | |
println(runner.getRunType) | |
if (runner.isInstanceOf[SpecialName]) { | |
println(runner.asInstanceOf[SpecialName].getSpecialName) | |
} | |
} | |
} |
Author
goldeneggg
commented
Oct 17, 2013
- 性別・距離適性・脚質はHorseとRunnerで共通の属性、「横断的なタグ」としてトレイトを使ってみた
- コップ本でいうところの「積み重ね変更なトレイト」で、極端な脚質を表現してみた
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment