2015-05-19 6 views
8

में स्कैला विरासत डिफ़ॉल्ट पैरामीटर मेरे पास पैरामीटर के लिए एक डिफ़ॉल्ट मान वाला एक सार वर्ग है। मैं सभी संभावित कार्यान्वयन के निर्माता में डिफ़ॉल्ट मान का पुन: उपयोग नहीं करना चाहता हूं।मूल वर्ग

abstract class Place(val place: String = "World") 
class Message(val message: String = "Hello", p: String) extends Place(p) { 
    override def toString = s"$message $place" 
} 

क्या मैं

new Message("Hi", "Universe") = "Hi Universe" // Ok 
new Message("Hi") = "Hi World" // Doesn't work, second parameter is required 
new Message() = "Hello World" // Doesn't work, second parameter is required 

मैं एक सहायक निर्माता दूसरा पैरामीटर को छोड़ते हुए का उपयोग कर विचार प्राप्त करना चाहते हैं, लेकिन यह मदद नहीं करता है के बाद से आप मुख्य निर्माता के बाहर सुपर कंस्ट्रक्टर्स फोन नहीं कर सकते हैं।

मैं जानना चाहता हूं कि यह कैसे करें, या यह क्यों संभव नहीं है। मैं विरासत का उपयोग नहीं करने की तरह कामकाज की तलाश नहीं कर रहा हूं।

उत्तर

1

आप एक और अधिक सुरुचिपूर्ण ढंग से डिफ़ॉल्ट मान का पुन: उपयोग कर सकते हैं:

object Place { 
    val defaultPlace = "World" 
} 
abstract class Place(val place: String = Place.defaultPlace) 
class Message(val message: String = "Hello", p: String = Place.defaultPlace) extends Place(p) { 
    override def toString = s"$message $place" 
} 
+0

काम करता है। encapsulated के रूप में नहीं। यहां आपके पास 3 ऑब्जेक्ट्स हैं जो ऑब्जेक्ट (ऑब्जेक्ट, अमूर्त, और क्लास) हैं। विशेष रूप से ऑब्जेक्ट और सार के समान क्रेडिट नहीं देना। वर्ग संदेश को ऑब्जेक्ट के बारे में जानना है, इसलिए इसका उपयोग करने के लिए अधिक तारों की आवश्यकता होती है, अगर इससे कोई समझ हो। सार और ठोस इसे सब संभाल लेना चाहिए। – Drew

3

मुझे डर है कि यह संभव नहीं है। काफी सरलता से, आप कन्स्ट्रक्टर को स्थानांतरित करने के लिए एक मान पास कर रहे हैं, इसलिए यह डिफ़ॉल्ट का उपयोग नहीं करेगा, जो भी हो सकता है।

स्काला में
abstract class Place(var place: String = "World") 
class Message(val message: String = "Hello") extends Place() 
{ 
    def this(message: String, place: String) = { 
     this(message) 
     this.place = place 
    } 
    override def toString = s"$message $place" 
} 

कंस्ट्रक्टर्स एक मेस IMHO का एक छोटा कर रहे हैं: आप एक वैल के बजाय एक वर होने से परहेज नहीं करते हैं, तो यहाँ एक प्रकार है कि अपने 3 मामलों के लिए काम करता है। कभी-कभी एक बेहतर उत्तर केवल एक साथी वस्तु पर कारखाने apply() विधियों का उपयोग करना है, जो अधिक लचीला हैं।

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