आप स्केल में ओवरलोडेड कंस्ट्रक्टर कैसे प्रदान करते हैं?
आप स्केल में ओवरलोडेड कंस्ट्रक्टर कैसे प्रदान करते हैं?
जवाबों:
यह स्पष्ट रूप से उल्लेख के लायक है कि स्काला में सहायक कंस्ट्रक्टर्स को या तो प्राथमिक कंस्ट्रक्टर को कॉल करना होगा (जैसा कि लैंडोन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);
}
new
केस कक्षाओं के लिए भी कीवर्ड आवश्यक है।
class Foo(x: Int, y: Int) {
def this(x: Int) = this(x, 0) // default y parameter to 0
}
स्कैला 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)
डिफ़ॉल्ट मान वाले पैरामीटर पैरामीटर सूची में कोई डिफ़ॉल्ट मान वाले लोगों के बाद आने चाहिए।
class Foo(val x:Int, y:Int=2*x)
काम नहीं करता।
new Foo(x=2,z=4)
छापेंगे Foo(2,0,4)
।
अपने कोड को देखते समय, मुझे अचानक एहसास हुआ कि मैंने एक ओवरलोड को एक निर्माता के रूप में किया है। फिर मुझे वह सवाल याद आया और एक और जवाब देने के लिए वापस आया:
स्काला में, आप निर्माणकर्ताओं को अधिभार नहीं दे सकते, लेकिन आप कार्यों के साथ ऐसा कर सकते हैं।
इसके अलावा, कई लोग 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]}
।
इसे इस्तेमाल करे
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
}
}
new Foo(x=2,z=4)
औरnew Foo(z=5)
यदि आप अपनी पहली पंक्ति कोclass Foo(x: Int = 0, y: Int = 0, z: String) {