2011-08-31 12 views
14

इस कोड पर विचार करें:अमूर्त कक्षाओं में माध्यमिक रचनाकारों का उपयोग केस क्या है?

abstract class Foo(val s: String) { 
    def this(i: Int) = this("" + (i+2)) 
} 

जहां तक ​​मैं समझता हूँ कंस्ट्रक्टर्स नहीं ली गई है और माध्यमिक निर्माताओं जावा में तरह super साथ उपवर्गों से नहीं कहा जा सकता।

क्या वे सिर्फ एक बेकार आर्टिफैक्ट हैं या क्या इस निर्माण के लिए कुछ समझदार उपयोग-मामला है?

उत्तर

17
scala> object Bar extends Foo(3) 
defined module Bar 

scala> Bar.s 
res3: String = 5 
11

उपclass के प्राथमिक निर्माता को सुपरक्लास के निर्माता में से एक को जरूरी प्राथमिक रूप से प्राथमिक नहीं होना चाहिए।

abstract class A(s: String) { 
    def this(i: Int) = this(i.toString) 
} 
class B(i: Int) extends A(i) 
3

@ coubeatczech के जवाब के अलावा, आप भी अगर आप एक शोधन जोड़ने सार वर्गों (और लक्षण) का उदाहरण बना सकते हैं,

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

abstract class Foo(val s: String) { 
    def this(i: Int) = this("" + (i+2)) 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 

scala> val f = new Foo(23) {} 
f: Foo = [email protected] 

scala> f.s 
res3: String = 25 

हालांकि मैं ऊपर एक खाली शोधन दिखाने ("है {} ") आप आम तौर पर कुछ अतिरिक्त परिभाषाएं प्रदान करते हैं, अक्सर अमूर्त सदस्यों के लिए कार्यान्वयन प्रदान करते हैं,

scala> abstract class Bar { def bar : Int } 
defined trait Bar 

scala> val b : Bar = new Bar { def bar = 23 } 
b: Bar = [email protected] 

scala> b.bar 
res1: Int = 23