Mixin
beginner's guideã®ã7 Mixinsããèªã¿ã¾ãããScalaã§ã¯ãRubyã®ãããªMixinã使ãã¾ãã
- ã¤ã¡ã¼ã¸ã¨ãã¦ã¯traitã¨å¼ã°ããAbstractãªClassãè¤æ°ç¶æ¿ããæãã
- ç¶æ¿ããã¯ã©ã¹ã§ã¯ãtraitã§å®ç¾©ãããå®è£ ãæã¤ã¡ã½ããã使ããã¨ãã§ããã
- ã¾ããtraitã§å®ç¾©ãããå®è£ ãæããªãã¡ã½ãããå®è£ ããå¿ è¦ãããã
// Mixinããã¡ã½ãããå®ç¾©ããtrait trait Comparable { // å®è£ ãæããªãã¡ã½ããã // æ´¾çã¯ã©ã¹ã¯ãããå®è£ ããå¿ è¦ãããã def compare(that:Any):int // 以ä¸ã®ã¡ã½ããã¯å®è£ ãæã¤ã def >(that:Any):boolean = compare(that) > 0 // Anyã¯ããã¹ã¦ã®åãã示ã def ===(that:Any):boolean = compare(that) == 0 def <(that:Any):boolean = compare(that) < 0 def >=(that:Any):boolean = compare(that) >= 0 def <=(that:Any):boolean = compare(that) <= 0 } // Mixinããã¡ã½ãããå®ç¾©ããtrait ãã®2 trait Named { def getName:String def tellYourName = println( "my name is " + getName + "!" ) } // Comparableã¨NamedãMixinãããã¯ã©ã¹ class Kitten( name:String, age:int ) // traitãç¶æ¿ãwithã§ã¤ãªãã§è¤æ°è¿½å ã§ããã extends Comparable with Named { def getName = name def getAge = age def compare(that:Any):int = { // ã¤ã³ã¹ã¿ã³ã¹ã®åããã§ã㯠if (!that.isInstanceOf[Kitten]) { error("that isnot Kitten.") } // ãã£ã¹ã val o = that.asInstanceOf[Kitten] return getAge - o.getAge } } // Mixinããã¯ã©ã¹ã使ããµã³ãã«ã object MixinSample { def main(args: Array[String]) { var mii = new Kitten( "mii", 1) var tora = new Kitten( "tora", 1) var shiro = new Kitten( "shiro", 2) mii.tellYourName tora.tellYourName println("mii > tora : " + (mii > tora).toString() ) // false println("mii < tora : " + (mii < tora).toString() ) // false println("mii === tora : " + (mii === tora).toString() ) // true println("mii >= tora : " + (mii >= tora).toString() ) // true println("mii <= tora : " + (mii <= tora).toString() ) // true println("mii > shiro : " + (mii > shiro).toString() ) // false println("mii < shiro : " + (mii < shiro).toString() ) // true println("mii === shiro : " + (mii === shiro).toString() ) // false println("mii >= shiro : " + (mii >= shiro).toString() ) // false println("mii <= shiro : " + (mii <= shiro).toString() ) // true } }
å®è¡çµæã§ãã
my name is mii! my name is tora! mii > tora : false mii < tora : false mii === tora : true mii >= tora : true mii <= tora : true mii > shiro : false mii < shiro : true mii === shiro : false mii >= shiro : false mii <= shiro : true
ãããKittenãcompareãå®è£ ãã¦ããªããã°ãã³ã³ãã¤ã«æã«ä»¥ä¸ã®ãããªã¨ã©ã¼ã«ãªãã¾ãã
MixinSample.scala:12: error: class Kitten needs to be abstract, since method compare in trait Comparable of type (Any)int is not defined class Kitten( name:String, age:int ) ^ one error found
ããã¯ãããªã¼ãRubyã§ãMixinã¯ã§ãããã©ãMixinã使ãå´ã®ã¯ã©ã¹(ä¸ã®ä¾ã§ã¯Kitten)ã§å®è£ ãå¿ è¦ãªAPIããã§ãã¯ããä»çµã¿ã¯ãªãã£ãã¯ãã(ãããããããããã§ãã¯ã¯ããªãã¨ããè¨è¨ææ³ãªã®ããã ãã©)ãããããåãã§ãã¯ã¯ãã£ã¦ããããªã¨æãã