2010-06-27 15 views
7

जावा से आ रहा है मैं स्काला के वर्ग/ऑब्जेक्ट भेद से उलझन में हूं। ध्यान दें कि मैं औपचारिक अंतर नहीं मांगता; वेब पर पर्याप्त संदर्भ हैं जो इसे समझाते हैं, और SO पर संबंधित प्रश्न हैं।स्कैला - कक्षाएं पर्याप्त हैं?

मेरे प्रश्न हैं:

  1. क्यों स्केला के डिजाइनर चीजें अधिक जटिल (जावा या सी # की तुलना में) बनाने के लिए choosed किया? पर मुझे क्या नुकसान होने की उम्मीद है यदि मैं इस भेद को अनदेखा करता हूं और केवल कक्षाएं घोषित करता हूं?

धन्यवाद।

+1

स्केल को "जटिल" होने के दृष्टिकोण पर विचार क्यों किया जाता है?प्रत्येक भाषा के साथ काम करने के बाद स्कैला का समाधान अब तक का सबसे आसान है, खासकर जब विरासत और उप-टाइपिंग खेल में आती है। – soc

उत्तर

2

स्कैला में मानक वर्गों के साथ स्थिर विधियों की कोई धारणा नहीं है, इसलिए उन परिदृश्यों में आपको वस्तुओं का उपयोग करना होगा। यहां दिलचस्प लेख जो कि एक अच्छा परिचय प्रदान करता है:

http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-3

(स्काला के स्टैटिक्स-की क्रमबद्ध के लिए नीचे स्क्रॉल)

23

जावा वर्गों के सदस्यों में से दो पूरी तरह से अलग अलग प्रकार के होते हैं - उदाहरण के सदस्यों (जैसे BigDecimal.plus के रूप में) और स्थिर सदस्य (जैसे BigDecimal.valueOf)। स्कैला में, केवल इंस्टेंस सदस्य हैं। यह वास्तव में एक सरलीकरण है! लेकिन यह एक समस्या छोड़ देता है: हम valueOf जैसे तरीके कहां डालते हैं? वहीं वस्तुएं उपयोगी होती हैं।

class BigDecimal(value: String) { 
    def plus(that: BigDecimal): BigDecimal = // ... 
} 

object BigDecimal { 
    def valueOf(i: Int): BigDecimal = // ... 
} 

आप गुमनाम वर्ग की घोषणा और उसके एक भी इन्स्टेन्शियशन के रूप में इस देख सकते हैं:

class BigDecimal$object { 
    def valueOf(i: Int): BigDecimal = // ... 
} 
lazy val BigDecimal = new BigDecimal$object 

जब स्काला कोड को पढ़ने के लिए, यह मूल्यों से प्रकार भेद करने के लिए महत्वपूर्ण है। मैंने IntelliJ को हाइटलाइट प्रकारों को नीले रंग में कॉन्फ़िगर किया है।

val ls = List.empty[Int] // List is a value, a reference the the object List 
ls: List[Int]    // List is a type, a reference to class List 

जावा में स्केल में हटाए गए जटिलता की एक और डिग्री भी है - फ़ील्ड और विधियों के बीच भेद। इंटरफेस पर फ़ील्ड की अनुमति नहीं है, सिवाय इसके कि वे स्थिर और अंतिम हैं; तरीकों को ओवरराइड किया जा सकता है, अगर उप-वर्ग में फिर से परिभाषित किया गया है तो इसके बजाय फ़ील्ड छुपाए गए हैं। स्कैला इस जटिलता से दूर है, और केवल प्रोग्रामर के लिए विधियों का खुलासा करता है।

अंत में, आपके दूसरे प्रश्न का एक ग्लिब उत्तर: यदि आप कोई ऑब्जेक्ट घोषित नहीं करते हैं, तो आप प्रोग्राम कभी नहीं चल सकते हैं, क्योंकि आप स्केल में public static void main(String... args) {} के बराबर परिभाषित करने के लिए, आपको कम से कम एक ऑब्जेक्ट चाहिए!

+0

ऑब्जेक्ट कीवर्ड आपको सिंगलटन क्लास (अंडर-द-हूड वैसे भी) देता है और स्काला के स्थिर सदस्यों के प्रतिस्थापन है। – apollodude217

+3

ध्यान रखें कि यदि आपके पास 'Something' नामक एक वर्ग है और' Something' 'नामक एक ऑब्जेक्ट है (उसी पैकेज में), तो उन दोनों को लिंक किया गया है - ऑब्जेक्ट कक्षा का * साथी ऑब्जेक्ट * है, और दोनों देख सकते हैं एक दूसरे के निजी सदस्य। जावा के साथ इसकी तुलना करना: कक्षा में विधियों के उदाहरण विधियों के रूप में सोचें, और उस वर्ग के स्थैतिक तरीकों के रूप में ऑब्जेक्ट में विधियों के बारे में सोचें। – Jesper

+1

अच्छा बिंदु, जेस्पर। इसके अलावा, किसी वर्ग या विशेषता 'टी' का साथी ऑब्जेक्ट 'टी' अंतर्निहित मूल्यों की खोज करते समय अंतर्निहित दायरे में है, 'टी' या' टी' का उप प्रकार प्रकार का एक हिस्सा है 'X'। इसका उपयोग अंतर्निहित विचारों और निहित तर्कों को खोजने के लिए किया जाता है। – retronym

0

इसे देखने का एक तरीका यह है। एक निष्पादन कार्यक्रम में वस्तुओं और धागे का एक समुदाय होता है। थ्रेड ऑब्जेक्ट्स के संदर्भ में कोड निष्पादित करते हैं - यानी हमेशा "यह" ऑब्जेक्ट होता है जो थ्रेड निष्पादित होता है। जावा से यह एक सरलीकरण है कि जावा में, हमेशा "यह" नहीं होता है। लेकिन अब एक चिकन/अंडे की समस्या है। यदि ऑब्जेक्ट्स के भीतर धागे और धागे द्वारा ऑब्जेक्ट्स निष्पादित किए जाते हैं, तो प्रारंभिक रूप से पहले धागे को किस ऑब्जेक्ट में निष्पादित किया जाता है। कार्यक्रम निष्पादन की शुरुआत में मौजूद वस्तुओं का एक nonempty सेट होना चाहिए। ये ऑब्जेक्ट्स object कीवर्ड के साथ घोषित की गई हैं।

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