2012-01-01 24 views
8

मैं कुछ इस तरह करना चाहते हैं की एक सार्वजनिक उप सदस्य उजागर (उदाहरण सरलीकृत है, लेकिन शामिल सभी महत्वपूर्ण टुकड़े):पहेली - कस्टम प्रकार के साथ निजी सदस्य

class Master 
{ 
    type DataType = Int 
    var counter : DataType = 0 
} 

class Slave(private val master : Master) 
{ 
    val counter = master.counter // (*) 
} 

और यहाँ (*) मैं त्रुटि:

private value master escapes its defining scope as part of type Slave.this.master.DataType

val counter = master.counter

मैं त्रुटि समझते हैं, लेकिन मैं कारण समझ में नहीं आता - प्रकार वर्ग Master, नहीं वस्तु master का हिस्सा है, इसलिए यह महत्वपूर्ण है अगर वर्ग निजी है, एक वस्तु नहीं खैर, कम से कम सिद्धांत में।

यह एक त्वरित समाधान का बनाने के लिए आसान है:

val counter : Master#DataType = master.counter 

लेकिन मेरा मानना ​​है कि यह बिल्कुल वैसा ही कोड का एक स्पष्ट संस्करण है के रूप में पहले, यह "केवल" अधिक टाइपिंग लेता है। क्या यह एक विशेषता है?

प्रश्न:

एक प्रकार (यहां डेटा प्रकार) वस्तु की निर्भर हो सकता है, और न वर्ग (कक्षा के कहने के अनुसार अर्थात प्रकार परिभाषा) स्काला में?

उत्तर

14

आप जब आपको लगता है

this is an explicit version of the exactly same code as before

Master#DataType और master.DataType दो अलग प्रकार के होते हैं गलत हैं।

master.DataType उन DataType उदाहरणों का प्रकार है जिनके पास master बाहरी ऑब्जेक्ट के रूप में है। दूसरे शब्दों में, ठीक है कि आप क्या पूछते हैं, लेकिन स्पष्ट रूप से master प्रकार का हिस्सा है, और master नहीं होने पर प्रकार का खुलासा नहीं किया जा सकता है।

Master#DataType किसी भी बाहरी ऑब्जेक्ट के लिए DataType उदाहरण का प्रकार है (जावा में Master.DataType के बराबर)।

टिप्पणी का जवाब दे:

प्रकार के सदस्यों (केवल एक ऑब्जेक्ट वाला एक गुमनाम उपवर्ग सहित) एक उपवर्ग में अधिरोहित जा सकता है, लेकिन केवल एक संगत प्रकार के आधार पर। और आपके उदाहरण में DataType पहले से ही Master में ठोस है, इसलिए इसके साथ एकमात्र संगत वर्ग स्वयं ही है। तो जैसे

val a = new Master { 
    override type DataType = String 
} 

कुछ typecheck नहीं है, जो समझ में आता है: आप var counter: String = 0 प्राप्त होता है, जो बकवास है। लेकिन

val a = new Master { 
    override type DataType = Int 
} 

काम करेगा (लेकिन यह बहुत उपयोगी नहीं है)।

तो यह केवल अमूर्त प्रकार सदस्यों को ओवरराइड करने का अर्थ बना देता है। लेकिन वे आंतरिक कक्षाओं के समान तरीके से टाइप-चेक किए जाते हैं, इसलिए a.DataType को आम तौर पर b.DataType के समान नहीं माना जाता है - भले ही वे वास्तव में अलग न हों!

+0

धन्यवाद, इसलिए यदि मैं इसे सही ढंग से समझता हूं (हालांकि मैंने इसे "स्केलिंग में प्रोग्रामिंग" में नहीं पढ़ा है, तो मुझे विश्वास है - या शायद यह फिसल गया है), आप कक्षा के प्रति उदाहरण प्रकार को परिभाषित नहीं कर सकते हैं, न केवल प्रति वर्ग । – greenoldman

+0

आप अद्यतन के लिए धन्यवाद, यह बहुत ही मूल्यवान है, दुर्भाग्य से मैं वोट दें नहीं कर सकते हैं अपनी पोस्ट 1 से अधिक :-) – greenoldman

+0

यह स्काला में उन लोगों के लिए उपयोगी चीजें हैं जो हो सकता है में से एक है एक "पकड़ लिया" जब अन्य OOP भाषाओं से आ रही। बहुत संक्षिप्त जवाब; मेरी वोट दें लायक;)। – TechNeilogy

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