स्काला में वस्तु और वर्ग के बीच अंतर


635

मैं अभी इंटरनेट पर कुछ स्काला ट्यूटोरियल पर जा रहा हूं और कुछ उदाहरणों में देखा है कि उदाहरण के प्रारंभ में एक ऑब्जेक्ट घोषित किया जाता है।

स्काला में classऔर क्या अंतर है object?

जवाबों:


578

tl; डॉ

  • class C जावा या C ++ की तरह ही एक क्लास को परिभाषित करता है।
  • object Oकुछ अनाम वर्ग के उदाहरण के रूप में एक सिंगलटन ऑब्जेक्ट बनाता है O; इसका उपयोग स्थिर सदस्यों को रखने के लिए किया जा सकता है जो किसी वर्ग के उदाहरणों से संबद्ध नहीं हैं।
  • object O extends Tवस्तु का Oएक उदाहरण बनाता है trait T; आप तब Oकहीं भी गुजर सकते हैं , एक Tउम्मीद है।
  • यदि कोई है class C, तो कक्षा object Cकी साथी वस्तु है C; ध्यान दें कि साथी वस्तु है नहीं स्वचालित रूप से का एक उदाहरण C

ऑब्जेक्ट और क्लास के लिए स्काला प्रलेखन भी देखें ।

object स्थिर सदस्यों के मेजबान के रूप में

सबसे अधिक बार, आपको उन objectविधियों और मूल्यों / चर को पकड़ने की आवश्यकता होती है जो पहले कुछ वर्ग के उदाहरण को बिना बताए उपलब्ध होंगे। यह उपयोग staticजावा में सदस्यों से निकटता से संबंधित है ।

object A {
  def twice(i: Int): Int = 2*i
}

आप तब विधि का उपयोग करके ऊपर कॉल कर सकते हैं A.twice(2)

यदि आप twiceकिसी वर्ग के सदस्य थे A, तो आपको पहले एक उदाहरण बनाने की आवश्यकता होगी:

class A() {
  def twice(i: Int): Int = 2 * i
}

val a = new A()
a.twice(2)

आप देख सकते हैं कि यह कितना बेमानी है, क्योंकि twiceइसके लिए किसी विशिष्ट-विशिष्ट डेटा की आवश्यकता नहीं है।

object एक विशेष नाम उदाहरण के रूप में

आप objectकिसी वर्ग या विशेषता के कुछ विशेष उदाहरणों के रूप में भी स्वयं का उपयोग कर सकते हैं । जब आप ऐसा करते हैं, तो आपकी वस्तु को traitउप-वर्ग का एक उदाहरण बनने के लिए कुछ का विस्तार करना होगा।

निम्नलिखित कोड पर विचार करें:

object A extends B with C {
  ...
}

इस घोषणा पहले एक गुमनाम (दुर्गम) वर्ग है कि दोनों फैली हुई वाणी Bऔर C, और इस वर्ग के नाम पर रखा गया का एक उदाहरण को दर्शाता है A

इसका अर्थ Aहै प्रकार Bया C, या वस्तुओं की अपेक्षा वाले कार्यों को पारित किया जा सकता है B with C

की अतिरिक्त विशेषताएं object

स्काला में वस्तुओं की कुछ विशेष विशेषताएं भी मौजूद हैं। मैं आधिकारिक दस्तावेज पढ़ने की सलाह देता हूं ।

  • def apply(...) सामान्य विधि नाम-कम सिंटैक्स सक्षम करता है A(...)
  • def unapply(...)कस्टम पैटर्न मिलान चिमटा बनाने की अनुमति देता है
  • यदि समान नाम के एक वर्ग के साथ, ऑब्जेक्ट निहित मापदंडों का समाधान करते समय एक विशेष भूमिका मानता है

38
यह क्लास ए को भी परिभाषित करेगा, और ऑब्जेक्ट ए के सभी तरीकों को क्लास ए पर स्थिर तरीकों के रूप में बनाएगा (जावा के साथ इंटरफेस के लिए)। (स्काला 2.7 में एक बग मोडुला जो कि स्केल 2.8 में तय किया गया है)
केन ब्लूम

2
@KenBloom वास्तव में? मैंने कोशिश की और काम नहीं करता है: scala> Commerce res8: Commerce.type = Commerce $ @ 6eb2756 scala> classOf [वाणिज्य] <कंसोल>: 23: त्रुटि: नहीं पाया गया: टाइप करें class classff [वाणिज्य] ^ scala - नया वाणिज्य < कंसोल>: 23: त्रुटि: नहीं पाया गया: टाइप करें वाणिज्य नया वाणिज्य ^
हेंडी इरावन

3
@ हेंडी: स्काला Commerceवर्ग को मान्यता नहीं देगा , लेकिन जेवीएम और जावा भाषा को। (यह है कि आप कैसे कर सकते हैं object Foo{ def main(args:Seq[String]) }और कार्यक्रम को चलाने की उम्मीद करते हैं।)
केन ब्लूम

3
मुझे लगता है कि जिग्गीस्टार का उत्तर अधिक सटीक है, वर्ग एक अनाम वर्ग है, जब तक कि वाणिज्य नामक एक संबंधित वर्ग को स्पष्ट रूप से परिभाषित नहीं किया जाता है (तब वाणिज्य वस्तु वाणिज्य वर्ग की एक साथी वस्तु होगी)
हेंडी इरावन

3
@DavidApltauer मुझे यकीन है कि पर्याप्त सूक्ष्मताएं हैं जो मेरे उत्तर द्वारा कवर नहीं की जाती हैं। लेकिन उन लोगों को शायद यह पढ़ने के लिए ज्यादातर लोगों के लिए कोई फर्क नहीं पड़ता। और मुझे किसी विशेषता के उदाहरण के रूप में एक वस्तु को पारित करने में कोई समस्या नहीं थी, जिसका मतलब यह नहीं है कि उनका अस्तित्व नहीं है; लेकिन यह काम करना चाहिए।
जिगसिस्टार

249

classपरिभाषा है, विवरण है। यह अन्य प्रकारों की विधियों और रचना के संदर्भ में एक प्रकार को परिभाषित करता है।

एक objectसिंगलटन है - एक वर्ग का एक उदाहरण जो अद्वितीय होने की गारंटी है। objectकोड में प्रत्येक के लिए, एक अनाम वर्ग बनाया जाता है, जो आपको objectलागू करने के लिए घोषित की गई कक्षाओं से विरासत में मिला है । इस वर्ग को स्काला स्रोत कोड से नहीं देखा जा सकता है - हालांकि आप इसे प्रतिबिंब के माध्यम से प्राप्त कर सकते हैं।

के बीच एक संबंध है object और class। एक वस्तु को एक वर्ग का साथी-वस्तु कहा जाता है यदि वे समान नाम साझा करते हैं। जब ऐसा होता है, तो प्रत्येक की privateदृश्यता के तरीकों तक पहुंच होती है । इन विधियों को स्वचालित रूप से आयात नहीं किया जाता है, हालांकि। आपको या तो उन्हें स्पष्ट रूप से आयात करना होगा, या उन्हें कक्षा / ऑब्जेक्ट नाम के साथ उपसर्ग करना होगा।

उदाहरण के लिए:

class X {
  // class X can see private members of object X
  // Prefix to call
  def m(x: Int) = X.f(x)

  // Import and use
  import X._
  def n(x: Int) = f(x)

  private def o = 2
}

object X {
  private def f(x: Int) = x * x

  // object X can see private members of class X
  def g(x: X) = {
    import x._
    x.o * o // fully specified and imported
   }
}

1
आपको परेशान करने के लिए क्षमा करें, लेकिन क्या आप शायद उदाहरण के लिए इंगित कर सकते हैं कि कैसे साथी वस्तु में तरीकों को आयात करें या उन्हें कैसे उपसर्ग करें?
kuथकुइल

4
@ ितकुिल डन। मूर्खतापूर्ण उदाहरण के बारे में क्षमा करें, मैं एक अच्छे और छोटे के बारे में नहीं सोच सकता।
डैनियल सी। सोबरल

यदि मैं क्लास मेथड का उपयोग करना चाहता हूं तो क्या होगा? क्या ऐसा संभव होगा? यदि मेरे पास कक्षा की एक विधि है और मैं इसे ऑब्जेक्ट में उपयोग करना चाहता हूं, तो यदि आप कक्षा को आयात करने का प्रयास करते हैं, तो आप नहीं कर पाएंगे। आखिरकार आपको एक कंस्ट्रक्टर बनाना होगा और फिर विधि को कॉल करना होगा। इसलिए, एक साथी ऑब्जेक्ट बनाकर, आप आयात का उपयोग करके ऑब्जेक्ट के तरीकों तक पहुंच सकते हैं, लेकिन इसके विपरीत नहीं। क्या कोई कृपया मान्य कर सकता है?
पीयूष गोयल

@ पीयूष गोयल सच नहीं हैं। कहें कि वस्तु की एक विधि है def f(x: X) = ???, तो वह निजी तरीकों को xसाथी वर्ग की कॉल करने में सक्षम होगा X
डैनियल सी। सोबरल

यहाँ X फ़ंक्शन में पास किया गया XI अनुमान कक्षा का उदाहरण है? यदि हाँ, तो आखिरकार आप ऑब्जेक्ट x का उपयोग कर रहे हैं डी एफ में एक्स वर्ग की विधि को कॉल करने के लिए .. सही है?
पीयूष गोयल

76

एक वस्तु का ठीक एक उदाहरण है (आप कॉल नहीं कर सकते हैं new MyObject)। आपके पास एक वर्ग के कई उदाहरण हो सकते हैं ।

ऑब्जेक्ट जावा में स्थिर तरीकों और क्षेत्रों के समान (और कुछ अतिरिक्त) उद्देश्यों को पूरा करता है।


19

जैसा कि कई लोगों द्वारा समझाया गया है, objectएक एकल उदाहरण को परिभाषित करता है। यहाँ जवाब में एक बात जो मुझे विश्वास है कि छोड़ दी गई है जो objectकई उद्देश्यों को पूरा करती है।

  • यह एक class/ के लिए साथी वस्तु traitहो सकती है, जिसमें स्थैतिक विधियों या सुविधा विधियों को माना जा सकता है।

  • यह एक मॉड्यूल की तरह ज्यादा कार्य कर सकता है, जिसमें संबंधित / सहायक प्रकार और परिभाषाएं शामिल हैं, आदि।

  • यह एक classया एक या अधिक traitएस बढ़ाकर एक इंटरफ़ेस लागू कर सकता है ।

  • यह एक ऐसे मामले का प्रतिनिधित्व कर सकता sealed traitहै जिसमें कोई डेटा नहीं है। इस संबंध में, यह अक्सर case classबिना किसी पैरामीटर के साथ अधिक सही माना जाता है । sealed traitकेवल case objectकार्यान्वयनकर्ताओं के साथ विशेष मामला कमोबेश किसी Enum का Scala संस्करण है।

  • यह implicit-driven तर्क के लिए सबूत के रूप में कार्य कर सकता है।

  • यह एक एकल प्रकार का परिचय देता है।

यह एक बहुत शक्तिशाली और सामान्य निर्माण है। स्काला शुरुआती के लिए बहुत भ्रमित करने वाली बात यह हो सकती है कि एक ही निर्माण में अलग-अलग उपयोग हो सकते हैं। और एक objectइन सभी के कई अलग-अलग उपयोगों की सेवा कर सकता है, जो और भी अधिक भ्रमित हो सकते हैं।


18

स्काला में एक वस्तु को परिभाषित करना जावा में एक वर्ग को परिभाषित करने जैसा है जिसमें केवल स्थिर विधियां हैं। हालांकि, स्काला में एक ऑब्जेक्ट एक और सुपरक्लास का विस्तार कर सकता है, इंटरफेस को लागू कर सकता है, और चारों ओर पारित किया जा सकता है, हालांकि यह एक वर्ग का एक उदाहरण था। (तो यह एक वर्ग पर स्थिर तरीकों की तरह है लेकिन बेहतर है)।


17

औपचारिक अंतर -

  1. आप ऑब्जेक्ट के लिए कंस्ट्रक्टर पैरामीटर प्रदान नहीं कर सकते हैं
  2. ऑब्जेक्ट एक प्रकार नहीं है - आप नए ऑपरेटर के साथ एक उदाहरण नहीं बना सकते हैं। लेकिन इसमें क्षेत्र, विधियां हो सकती हैं, एक सुपरक्लास का विस्तार कर सकते हैं और लक्षणों में मिश्रण कर सकते हैं।

उपयोग में अंतर:

  • स्काला में स्थैतिक विधियाँ या क्षेत्र नहीं हैं। इसके बजाय आपको उपयोग करना चाहिएobject । आप इसे संबंधित वर्ग के साथ या बिना उपयोग कर सकते हैं। 1 मामले में इसे एक साथी वस्तु कहा जाता है। आपको करना होगा:
    1. वर्ग और वस्तु दोनों के लिए समान नाम का उपयोग करें
    2. उन्हें उसी स्रोत फ़ाइल में रखें।
  • एक कार्यक्रम बनाने के लिए आपको मुख्य विधि का उपयोग करना चाहिए object, अंदर नहीं class

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
  • आप इसे भी उपयोग कर सकते हैं क्योंकि आप जावा में सिंगलटन ऑब्जेक्ट का उपयोग करते हैं।

      
        
      


"आप ऑब्जेक्ट के लिए कंस्ट्रक्टर पैरामीटर प्रदान नहीं कर सकते हैं" ऑब्जेक्ट में लागू (...) विधि है, जो एक निर्माता की तरह बहुत काम करता है। यह मुझे थोड़ा भ्रमित करता है।
डेनिएल

7

वस्तु कीवर्ड एक नई सिंगलटन प्रकार है, जो एक तरह है बनाता वर्ग केवल एक ही नामित उदाहरण है। यदि आप जावा से परिचित हैं, तो स्काला में एक वस्तु की घोषणा करना एक अनाम वर्ग का एक नया उदाहरण बनाने जैसा है।

स्काला में जावा के स्थिर कीवर्ड के बराबर नहीं है , और स्कैला में अक्सर एक ऑब्जेक्ट का उपयोग किया जाता है जहां आप जावा में स्थिर सदस्यों के साथ एक वर्ग का उपयोग कर सकते हैं।


6

ऑब्जेक्ट एक वर्ग है लेकिन उसके पास पहले से ही एक (उदाहरण) है, इसलिए आप कॉल नहीं कर सकते new ObjectName। दूसरी ओर, क्लास केवल प्रकार है और यह कॉल करके एक उदाहरण हो सकता है new ClassName()


4

स्काला में, कोई staticअवधारणा नहीं है। तो scala आपके प्रोग्राम के निष्पादन के लिए प्रवेश बिंदु प्रदान करने के लिए एक सिंगलटन ऑब्जेक्ट बनाता है। यदि आप सिंगलटन ऑब्जेक्ट नहीं बनाते हैं, तो आपका कोड सफलतापूर्वक संकलित करेगा लेकिन कोई आउटपुट नहीं देगा। सिंगलटन ऑब्जेक्ट के अंदर घोषित तरीके विश्व स्तर पर सुलभ हैं। एक सिंगलटन ऑब्जेक्ट कक्षाओं और लक्षणों का विस्तार कर सकता है।

स्काला सिंगलटन ऑब्जेक्ट उदाहरण

object Singleton{  
    def main(args:Array[String]){  
        SingletonObject.hello()         // No need to create object.  
    }  
}  


object SingletonObject{  
    def hello(){  
        println("Hello, This is Singleton Object")  
    }  
}  

आउटपुट:

Hello, This is Singleton Object

स्काला में, जब आपके पास सिंगलटन ऑब्जेक्ट के समान नाम वाला एक वर्ग होता है, तो इसे साथी क्लास कहा जाता है और सिंगलटन ऑब्जेक्ट को साथी ऑब्जेक्ट कहा जाता है।

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

स्काला कम्पैनियन ऑब्जेक्ट उदाहरण

class ComapanionClass{  
    def hello(){  
        println("Hello, this is Companion Class.")  
    }  
}  
object CompanoinObject{  
    def main(args:Array[String]){  
        new ComapanionClass().hello()  
        println("And this is Companion Object.")  
    }  
}  

आउटपुट:

Hello, this is Companion Class.
And this is Companion Object.

स्काला में, एक वर्ग शामिल हो सकता है:

1. डेटा सदस्य

2. सदस्य विधि

3. कंस्ट्रक्टर ब्लॉक

4. नेस्टेड क्लास

5. सुपर क्लास की जानकारी आदि।

आपको कक्षा में सभी उदाहरण चर को इनिशियलाइज़ करना होगा। कोई डिफ़ॉल्ट स्कोप नहीं है। यदि आप एक्सेस स्कोप निर्दिष्ट नहीं करते हैं, तो यह सार्वजनिक है। एक वस्तु होनी चाहिए जिसमें मुख्य विधि परिभाषित हो। यह आपके प्रोग्राम के लिए शुरुआती बिंदु प्रदान करता है। यहाँ, हमने कक्षा का एक उदाहरण बनाया है।

वर्ग का स्काला नमूना उदाहरण

class Student{  
    var id:Int = 0;                         // All fields must be initialized  
    var name:String = null;  
}  
object MainObject{  
    def main(args:Array[String]){  
        var s = new Student()               // Creating an object  
        println(s.id+" "+s.name);  
    }  
} 

मुझे खेद है, मुझे बहुत देर हो गई है लेकिन मुझे उम्मीद है कि यह आपकी मदद करेगा।


2

जावा क्लास के समान स्कैला क्लास लेकिन स्कैला आपको क्लास में प्रवेश की कोई विधि नहीं देता, जैसे जावा में मुख्य विधि। ऑब्जेक्ट कीवर्ड से जुड़ी मुख्य विधि। आप ऑब्जेक्ट कीवर्ड के बारे में एक वर्ग के सिंगलटन ऑब्जेक्ट बनाने के बारे में सोच सकते हैं जो कि स्पष्ट रूप से परिभाषित किया गया है।

अधिक जानकारी scala प्रोग्रामिंग में इस लेख वर्ग और ऑब्जेक्ट कीवर्ड की जाँच करें


2

ऑब्जेक्ट कुछ विस्तार में जावा में स्थिर वर्ग के समान है, स्थिर विशेषता का अर्थ है कि स्थिर वर्ग को जेवीएम में डालते समय ऑब्जेक्ट बनाने की आवश्यकता नहीं है, इसका उपयोग सीधे वर्ग नाम और उसी उदाहरण (समान डेटा स्थिति) द्वारा किया जा सकता है ) का उपयोग किया जाता है जहाँ भी साझा किया जाता है।


1

एक वर्ग अन्य भाषाओं के किसी भी वर्ग की तरह है। आप किसी वाक्य रचना के अंतर के साथ किसी अन्य भाषा की तरह ही कक्षा को परिभाषित करते हैं।

class Person(val name: String)
val me = new Person("My name")

हालाँकि, ऑब्जेक्ट केवल एकल ऑब्जेक्ट के साथ एक वर्ग है। यह इसे दिलचस्प बनाता है क्योंकि इसका उपयोग एक वर्ग के स्थिर सदस्यों को साथी ऑब्जेक्ट का उपयोग करने के लिए किया जा सकता है । इस साथी ऑब्जेक्ट की कक्षा परिभाषा के निजी सदस्यों तक पहुंच है और इसका वही नाम है जिस वर्ग को आप परिभाषित कर रहे हैं।

class Person(var name: String) {

  import Person._

  def hi(): String = sayHello(name)
}

object Person {
  private def sayHello(name: String): String = "Hello " + name
}

val me = new Person("My name")
me.hi()

इसके अलावा, उल्लेखनीय बिंदु यह है कि ऑब्जेक्ट क्लास को आलसी बनाया गया है जो एक और महत्वपूर्ण बिंदु है। इसलिए, जब तक उन्हें हमारे कोड में आवश्यक नहीं किया जाता है, ये तत्काल नहीं हैं।

यदि आप JDBC के लिए कनेक्शन निर्माण को परिभाषित कर रहे हैं, तो आप उन्हें ऑब्जेक्ट के अंदर बना सकते हैं जैसे कि हम एकल ऑब्जेक्ट्स के साथ जावा में करते हैं।


0

यदि आप जावा बैकग्राउंड से आ रहे हैं तो स्कैला में क्लास की अवधारणा जावा के समान है, लेकिन स्कैला कैंट में क्लास में स्थिर सदस्य होते हैं।

Scala में ऑब्जेक्ट्स सिंगलटन प्रकार होते हैं जिन्हें आप ऑब्जेक्ट नाम का उपयोग करके इसके अंदर तरीके कहते हैं, scala ऑब्जेक्ट में एक कीवर्ड है और जावा ऑब्जेक्ट में क्लास का एक उदाहरण है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.