Skip to content

Instantly share code, notes, and snippets.

@goldeneggg
Created October 17, 2013 09:08
Show Gist options
  • Save goldeneggg/7021663 to your computer and use it in GitHub Desktop.
Save goldeneggg/7021663 to your computer and use it in GitHub Desktop.
Scalaのトレイトで馬(と陸上走者)を表現してみた
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)
}
}
}
@goldeneggg
Copy link
Author

  • 性別・距離適性・脚質はHorseとRunnerで共通の属性、「横断的なタグ」としてトレイトを使ってみた
  • コップ本でいうところの「積み重ね変更なトレイト」で、極端な脚質を表現してみた

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment