स्केल निर्माता अधिभार?


जवाबों:


186

यह स्पष्ट रूप से उल्लेख के लायक है कि स्काला में सहायक कंस्ट्रक्टर्स को या तो प्राथमिक कंस्ट्रक्टर को कॉल करना होगा (जैसा कि लैंडोन9720 के उत्तर में है), या उसी वर्ग से एक अन्य सहायक कंस्ट्रक्टर को उनकी पहली कार्रवाई के रूप में। वे केवल सुपरक्लास के निर्माता को स्पष्ट रूप से या अंतर्निहित रूप से नहीं कह सकते हैं जैसा कि वे जावा में कर सकते हैं। यह सुनिश्चित करता है कि प्राथमिक निर्माता कक्षा में प्रवेश का एकमात्र बिंदु है।

class Foo(x: Int, y: Int, z: String) {  
  // default y parameter to 0  
  def this(x: Int, z: String) = this(x, 0, z)   
  // default x & y parameters to 0
  // calls previous auxiliary constructor which calls the primary constructor  
  def this(z: String) = this(0, z);   
}

@Jon McAuliffe: बुरी मिसाल? दूसरे और तीसरे कंस्ट्रक्टर्स के बिना, उपयोगकर्ता अभी भी कॉल कर सकता है new Foo(x=2,z=4)और new Foo(z=5)यदि आप अपनी पहली पंक्ति को class Foo(x: Int = 0, y: Int = 0, z: String) {
बदलकर

नामांकित / डिफ़ॉल्ट तर्क स्केल 2.8 तक नहीं पहुंचे।
जॉन मैकऑलिफ

2
यह ओवरलोड कंस्ट्रक्टर का उपयोग करने का उल्लेख करने के लायक होगा। यह तुच्छ नहीं है कि newकेस कक्षाओं के लिए भी कीवर्ड आवश्यक है।
पढ़ने वाले


16

स्कैला 2.8.0 के रूप में आपके पास संदूषण- और विधि मापदंडों के लिए डिफ़ॉल्ट मान भी हो सकते हैं। ऐशे ही

scala> class Foo(x:Int, y:Int = 0, z:Int=0) {                           
     | override def toString() = { "Foo(" + x + ", " + y + ", " + z + ")" }
     | }
defined class Foo

scala> new Foo(1, 2, 3)                                                    
res0: Foo = Foo(1, 2, 3)

scala> new Foo(4)                                                          
res1: Foo = Foo(4, 0, 0)

डिफ़ॉल्ट मान वाले पैरामीटर पैरामीटर सूची में कोई डिफ़ॉल्ट मान वाले लोगों के बाद आने चाहिए।


3
हालांकि यह गैर-तुच्छ चूक के लिए काम नहीं करता है। इसलिए class Foo(val x:Int, y:Int=2*x)काम नहीं करता।
सबब

@ जोर्जेन लुंडबर्ग: आपने लिखा पैरामीटर्स डिफॉल्ट वैल्यूज के साथ आने चाहिए, पैरामीटर लिस्ट में कोई डिफॉल्ट वैल्यू वाले नहीं होने चाहिए। यह गलत है, new Foo(x=2,z=4)छापेंगे Foo(2,0,4)
user2987828

@ user2987828 जो मेरा मतलब था कि आप नया फू (12, x = 2) नहीं लिख सकते हैं, आपको नया फू (x = 2, 12) लिखना होगा। आप नया फू (12, y = 2) लिख सकते हैं, फिर आपको फू (12, 2, 0) मिलेगा
Jörgen Lundberg

10

अपने कोड को देखते समय, मुझे अचानक एहसास हुआ कि मैंने एक ओवरलोड को एक निर्माता के रूप में किया है। फिर मुझे वह सवाल याद आया और एक और जवाब देने के लिए वापस आया:

स्काला में, आप निर्माणकर्ताओं को अधिभार नहीं दे सकते, लेकिन आप कार्यों के साथ ऐसा कर सकते हैं।

इसके अलावा, कई लोग applyसंबंधित कक्षा के लिए एक साथी के कार्य को एक कारखाना बनाने के लिए चुनते हैं ।

इस वर्ग को अमूर्त बनाना और इस वर्ग applyको लागू करने के लिए फ़ंक्शन को ओवरलोड करना , आपके पास अपना अतिभारित "कंस्ट्रक्टर" है:

abstract class Expectation[T] extends BooleanStatement {
    val expected: Seq[T]}

object Expectation {
    def apply[T](expd:     T ): Expectation[T] = new Expectation[T] {val expected = List(expd)}
    def apply[T](expd: Seq[T]): Expectation[T] = new Expectation[T] {val expected =      expd }

    def main(args: Array[String]): Unit = {
        val expectTrueness = Expectation(true)}
}

ध्यान दें कि मैं स्पष्ट रूप applyसे लौटने के लिए प्रत्येक को परिभाषित करता हूं Expectation[T], अन्यथा यह एक बतख-टाइप लौटाएगा Expectation[T]{val expected: List[T]}


0

इसे इस्तेमाल करे

class A(x: Int, y: Int) {
  def this(x: Int) = this(x, x)
  def this() = this(1)
  override def toString() = "x=" + x + " y=" + y
  class B(a: Int, b: Int, c: String) {
    def this(str: String) = this(x, y, str)
    override def toString() =
      "x=" + x + " y=" + y + " a=" + a + " b=" + b + " c=" + c
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.