वर

2011-02-13 14 views
9

उम्मीद है कि एक छोटे से जवाब के साथ एक छोटा सा सवाल पर अधिभावी सेटर:वर

मैं अपने वर्ग जब भी यह सेट किया गया है अद्यतन किसी तरह को गति प्रदान करने की जरूरत है कि एक var है। मुझे पता है कि var इसके साथ दो तरीकों से मिलता है, एक गेटर और एक सेटर। क्या किसी भी तरह से सेटर विधि को ओवरराइड करना संभव है ताकि यह सुनिश्चित किया जा सके कि अद्यतन ट्रिगर हो गया है, बिना रिकर्सिव किए? मेरा मतलब है

def a_=(x: Any) = { a = x; update } 

शायद एक अनंत रिकर्सन होगा, है ना?

var केवल कक्षा के बाहर सेट कर दिया जाता है और केवल पढ़ने के लिए वर्ग के अंदर, हो सकता है कि मदद करता है।

सुनने के लिए धन्यवाद। क्योंकि यह संकलन नहीं होगा

+0

आप एक के लिए एक प्रॉक्सी के रूप में एक और वर का उपयोग कर सकते हैं? इसे एक के लिए गेटर में पढ़ें, सेटर में सेट करें (और 'अपडेट' कॉल करें), और बाहरी दुनिया अंतर नहीं बता सकती है। –

उत्तर

4

आपका कोड एक अनंत प्रत्यावर्तन कभी नहीं होगा। कंपाइलर द्वारा गेटटर और एक सेटर के अंतर्निहित निर्माण के कारण आप दो बार ऐसी विधियां नहीं बना सकते हैं। मुझे नहीं पता कि क्या कोई कारण है कि कंपाइलर जांच नहीं करता है कि गेटटर या सेटर मौजूद है या नहीं, केवल तभी यदि ऐसी कोई विधि नहीं है तो यह एक बना देता है।

आप निजी चर का नाम बदलकर उसे इस समस्या से बचने कर सकते हैं:

class X(private var _i: Int) { 
    def i = _i 
    def i_=(i: Int) { 
    println(i) 
    _i = i 
    } 
} 

इन विधियों संकलक द्वारा उत्पन्न तरीकों के समान हस्ताक्षर किया है।

एक बार आप साथी ऑब्जेक्ट के अंदर ऐसा कर सकते हैं update विधि केवल नाम से जाना है, तब:

object X { 
    def apply(i: Int) = { 
    update 
    new X(i) 
    } 
} 
class X(i: Int) 

वहाँ एक कारण है कि आप एक अपरिवर्तनीय वस्तु पसंद नहीं करते है? यदि नहीं, तो आप पुराने एक कॉपी और एक ही समय में एक नया मान सेट कर सकते हैं:

case class X(i: Int, j: Int) 
val x1 = X(3, 6) 
val x2 = x1.copy(i = 1) // x2 = X(1,6) 
+2

नहीं, मुझे यहां एक परिवर्तनीय स्थिति की आवश्यकता है, यह एक स्विंग घटक का सदस्य 'var' है। मैं शायद यहां प्रॉक्सी विधि के लिए जाऊंगा, केवल एकमात्र समाधान जिसे मैं देख सकता हूं। लेकिन यह इतना है ... सुरुचिपूर्ण। जावा पर स्कैला चुनने का एक कारण है। लेकिन इनपुट के लिए धन्यवाद। – Lanbo

+0

@ स्कैन - यदि यह एक स्विंग घटक का 'var' है, तो आप संभवतः एक बाल वर्ग बना रहे हैं, जो माता-पिता के गेटर और सेटर विधियों को ओवरराइड कर सकता है; फिर बाल वर्ग में सेटिंग करने के लिए 'super.i _ = (...)' का उपयोग करें। –

+0

@Rex केर - कारण है कि मैं एक बच्चे के वर्ग के लिए इस्तेमाल किया, इस राज्य के लिए - नहीं, यह मेरे बच्चे के लिए एक राज्य है। शायद यह किसी भी तरह से स्कैला भाषा के भविष्य के संस्करण में शामिल किया जा सकता है? – Lanbo

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