2011-11-18 26 views
38

में परिभाषित चर सेट करने के लिए स्कैला कन्स्ट्रक्टर का उपयोग करना यदि मैं सही ढंग से समझता हूं, तो जावा इंटरफेस और क्लास कन्स्ट्रक्टर के सबसे नज़दीकी चीजें स्वचालित रूप से चर सेट करती हैं।विशेषता

लेकिन क्या होगा अगर मैं एक वर्ग है कि एक विशेषता प्रदान करता है और एक निर्माता जो विशेषता से एक चर सेट है है, तो कुछ की तरह:

trait Foo { 
    var foo: String 
} 

class Bar (foo: String) extends Foo { /* ... */ } 

मैं विशेषता के foo स्ट्रिंग कहाँ चाहते हैं जब निर्धारित किया गया मैं Bar ऑब्जेक्ट बना देता हूं।

संकलक मुझे इस बारे में त्रुटियां देता है। इसे प्राप्त करने का सही तरीका क्या है?

+1

बस एक नोट: विशेषता प्रारंभिकता एक साधारण चीज नहीं है और चर के साथ और ओवरराइडिंग के साथ आप प्रारंभिकरण को बहुत तेज़ी से संकलित कर सकते हैं (मैंने किया)। सुनिश्चित करें कि आपको वास्तव में इसकी आवश्यकता है। – CheatEx

उत्तर

25

BarFoo में var foo को अवशोषित करना होगा (val के लिए समान होगा)। यह निर्माता

class Bar(var foo: String) extends Foo{...} 

में किया जा सकता है (बेशक, यह Bar के शरीर में भी किया जा सकता है)। डिफ़ॉल्ट रूप से, यदि आवश्यक हो तो कन्स्ट्रक्टर पैरामीटर निजी val पर बदल दिए जाएंगे, यानी यदि वे विधियों में initiailization कोड के बाहर उपयोग किए जाते हैं। लेकिन आप उन्हें val या var चिह्नित करके व्यवहार मजबूर कर सकते हैं, और संभवतः के रूप में

class X(protected val s: String, private var i: Int) 

यहाँ में आप एक सार्वजनिक var जरूरत Foo लागू करने के लिए दृश्यता को नियंत्रित।

30
trait Foo { var foo: String = _ } 
class Bar(foo0: String) extends Foo { foo = foo0 } 

विशेषता एक अनियमित var घोषित करती है; कक्षा तब इनपुट इनपुट पैरामीटर के बराबर सेट करती है।

वैकल्पिक रूप से,

trait Foo { 
    def foo: String 
    def foo_=(s: String): Unit 
} 
class Bar(var foo: String) extends Foo {} 

गेटर/सेटर एक foo है, जो वर्ग द्वारा स्थापित कर रहे हैं करने के लिए इसी जोड़ी की घोषणा की।

संबंधित मुद्दे