2011-08-05 7 views
6

मैं है निम्नलिखित कोड:क्या विभिन्न लक्षणों से श्रृंखला विधियों को संभव बनाना संभव है?

class ExtendedQuery extends Query with PageParameter with DateParameter 
val query = new ExtendedQuery 
query.page(4).pageSize(5).fromDate(new java.util.Date) 

या:

class Parameterizable{ 
    var map: Map[String, String] = new scala.collection.immutable.HashMap() 
    def put(entry: Tuple2[String, String]) = { 
    map = map + entry; this 
    } 
} 

class Query() extends Parameterizable{ 
    override def toString = { 
    map.isEmpty match{ 
     case true => "" 
     case false => "?" + map.map{case (key, value) => key + "=" + value}.mkString("&") 
    } 
    } 
} 

trait PageParameter extends Parameterizable{ 
    def page(page: Int) = put(("page" -> page.toString)) 
    def pageSize(pageSize: Int) = put(("pagesize" -> pageSize.toString)) 
} 

trait DateParameter extends Parameterizable{ 
    def fromDate(date: java.util.Date) = put(("fromdate" -> (date.getTime()/1000L).toString())) 
    def toDate(date: java.util.Date) = put(("todate" -> (date.getTime()/1000L).toString())) 
} 
//and other similar traits 

मैं की तरह कुछ करना चाहते हैं

query.and().page(4).and().pageSize(5).and().fromDate(new java.util.Date) 

यह संभव स्काला में है?

उत्तर

11

आप this.type लौटने के रूप में तरीकों घोषणा कर सकते हैं और फिर उन लोगों से this वापसी:

trait PageParameter extends Parameterizable{ 
    def page(page: Int) : this.type = { put(("page" -> page.toString)); this } 
    def pageSize(pageSize: Int): this.type = { put(("pagesize" -> pageSize.toString)); this } 
} 

उपयोग साइट पर, आप कॉल तो श्रृंखला कर सकते हैं के रूप में आप चाहते थे। इस उदाहरण देखें:

scala> trait Wibble { 
| def foo : this.type = { println("foo"); this } 
| } 
defined trait Wibble 

scala> trait Wobble extends Wibble { 
| def bar: this.type = { println("bar"); this } 
| } 
defined trait Wobble 

scala> trait Wubble extends Wibble { 
| def baz: this.type = { println("baz"); this } 
| } 
defined trait Wubble 

अब मैं इसे

scala> new Wibble with Wobble with Wubble 
res0: java.lang.Object with Wibble with Wobble with Wubble = [email protected] 

scala> res0.bar.baz.foo 
bar 
baz 
foo 
res1: res0.type = [email protected] 
परीक्षण कर सकते हैं
संबंधित मुद्दे