2011-01-28 7 views
10

का समर्थन करता है, मैं एक ऐसी विशेषता बनाना चाहता हूं जो कक्षा में कुछ संपत्ति जोड़ती है और इसे श्रृंखला विधियों के लिए संभव बनाता है। स्कैला 2.8.1 में परीक्षण किया गया।स्काला विशेषता को कार्यान्वित करने का सर्वोत्तम अभ्यास जो विधि चेनिंग

trait SomeProperty { 
    var prop : String = "default" 
    def setProp(s: String) = { 
     prop = s 
     this 
    } 
} 
sealed abstract class Value 
case class IntegerValue(v: Int) extends Value 
case class FloatValue(v: Float) extends Value with SomeProperty { 
    def foo() = { println("I'm foo.") } 
} 
case object UnknownValue extends Value with SomeProperty { 
    def bar() = { println("I'm bar.") } 
} 

scala> val x = UnknownValue 
scala> x.setProp("test").bar() 
<console>:10: error: value bar is not a member of SomeProperty 
    x.setProp("test").bar() 

इस तरह की स्थिति में सबसे आम प्रथा क्या है? (टाइप-सुरक्षित तरीका पसंदीदा है)

उत्तर

20

आप स्पष्ट रूप से इंस्टेंस प्रकार को सेटप्रॉप के लिए रिटर्न प्रकार के रूप में निर्दिष्ट कर सकते हैं।

trait SomeProperty { 
    var prop : String = "default" 
    def setProp(s: String):this.type = { 
     prop = s 
     this 
    } 
} 
+0

जो खोज रहे हैं यह बेहतर है। – lscoughlin

+0

यह काम करता है! लेकिन मुझे समझ में नहीं आता क्यों। मुझे लगता है कि 'this.type'' कुछ प्रॉपर्टी 'के बराबर है, है ना? क्या यह स्कैला विशिष्ट है? या जावा में भी संभव है? – ihji

+0

यह आलेख सहायक है। http://scalada.blogspot.com/2008/02/thistype-for-chaining-method-calls.html – ihji

0

सबसे आसान काम करना सामान्य है।

object Value { 

    trait SomeProperty[X] { 
    var str: String = null; 
    def setStr(s: String): X = { 
     str = s; 
     return this.asInstanceOf[X] 
    } 
    } 

    abstract sealed class Value 
    case class IntegerValue(i: Int) 
    case class StringValue(s: String) extends SomeProperty[StringValue] { 
    def foo(): Unit = { 
     println("Foo.") 
    } 
    } 
    case class UnknownValue(o: Any) extends SomeProperty[UnknownValue] { 
    def bar(): Unit = { 
     println("Bar.") 
    } 
    } 

    def main(args: Array[String]): Unit = { 

    new UnknownValue(18).setStr("blah blah blah").bar 
    new StringValue("A").setStr("halb halb halb").foo 
    } 
} 
1

सुनिश्चित नहीं हैं कि अगर यह आपके लिए

scala> trait Property[T] { 
    | me: T => 
    | var prop:String="" 
    | def setProp(s:String) = { 
    |  prop=s 
    |  me 
    | } 
    | } 
defined trait Property 

scala> class A extends Property[A] 
defined class A 

scala> class B extends Property[B] 
defined class B 

scala> val a= new A 
a: A = [email protected] 

scala> val b = new B 
b: B = [email protected] 

scala> a.setProp("Hi") 
res13: Property[A] with A = [email protected] 

scala> a.setProp("Hi").setProp("Bye") 
res14: Property[A] with A = [email protected] 

scala> b.setProp("D") 
res15: Property[B] with B = [email protected] 
संबंधित मुद्दे