शायद स्टाइल और लालित्य की अच्छी समझ के साथ एक स्कैला विशेषज्ञ मुझे निम्न कोड को संरचित करने के लिए एक अच्छा तरीका समझने में मदद कर सकता है, जिसमें एक निर्माता "पुश-आउट" समस्या है।मॉड्यूलर स्कैला डिज़ाइन: मैं कन्स्ट्रक्टर "पुश-आउट" बॉयलरप्लेट से कैसे बचूं?
हम एक सरल आधार वर्ग के साथ शुरू:
class Foo(val i: Int, val d: Double, val s: String) {
def add(f: Foo) = new Foo(i + f.i, d + f.d, s + f.s)
override def toString = "Foo(%d,%f,%s)".format(i,d,s)
}
एक जटिल आवेदन में प्रकार की जाँच प्रयोजनों के लिए, मैं किसी भी अतिरिक्त राज्य के बिना एक उप-वर्ग की आवश्यकता होती है:
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
यह खड़ा के रूप में , जब मैं दो बार्स जोड़ता हूं, तो मुझे केवल एक फू वापस मिलता है:
val x = new Bar(1,2.3,"x")
val y = new Bar(4,5.6,"y")
val xy = x.add(y)
में निम्नलिखित प्रतिक्रिया के साथ आरईपीएल:
x : Bar = Bar(1,2.300000,x)
y : Bar = Bar(4,5.600000,y)
xy : Foo = Foo(5,7.900000,xy)
मैं कैसे नीचे के रूप में दो बार एक साथ जोड़ने के लिए एक और बार (बजाय एक फू से) बनाने के लिए, एक सुरुचिपूर्ण ढंग से, कॉपी और फू के ऐड विधि पेस्ट किए बिना मिलता है,?
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
// ugly copy-and-paste from Foo:
def add(b: Bar) = new Bar(i + b.i, d + b.d, s + b.s)
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
मैं कई ऐसे बार्स (सभी अनिवार्य रूप से फू की प्रतियां, लेकिन प्रकार की जाँच के लिए बहुत महत्वपूर्ण है), एक कट और पेस्ट से मुक्त समाधान लाभांश का भुगतान करेगा।
धन्यवाद!
मैं विचार "लेबल के रूप में पैरामीटर", प्रकार की सुरक्षा के लिए की तरह है: तो, एक वैकल्पिक दृष्टिकोण एक ओवरराइड करने योग्य कारखाने विधि (जो केवल निर्माता के लिए एक प्रतिनिधि है) हो सकता है। धन्यवाद! –