मान लें मैं एक आधार वर्ग हैलक्षण और अमूर्त प्रकार
abstract class Base {
type B<: Base
def rep:String
def copy:B
}
class MyBase(override val rep:String) extends Base {
type B = MyBase
override def copy = new MyBase(rep)
}
मैं तो एक mixin, जिसके लिए मैं वापसी प्रकार चाहते हैं के रूप में एक और विशेषता को जोड़ने के लिए प्रति उचित प्रकार (जिसका अर्थ है बुला कि होने के लिए कोशिश मिक्स्ड पर प्रतिलिपि बी को उचित प्रकार में सेट करके एक मिश्रण प्रकार देता है)। मैं संकलित करने के लिए इसे प्राप्त करने में सक्षम नहीं हूं, या यहां तक कि समझने के लिए कि ओवरराइड कीवर्ड कहां जाना चाहिए।
संपादित: मैं उदाहरण
abstract class Base {
type B <: Base
def rep:String
def copy:B
}
class MyBase(val rep:String) extends Base {
type B = MyBase
def copy = new MyBase(rep)
}
trait DecBase extends Base {
abstract override def rep = "Rep: "+super.rep
}
मेरा प्रश्न है, मैं एक उचित ग्रुप बी कैसे घोषित करने और DecBase के लिए विधि कॉपी, ताकि प्रतिलिपि रिटर्न एक DecBase करते हैं, और भी, क्यों 'जीता परिष्कृत है यह संकलन नहीं है?
println(((new MyBase("ofer") with DecBase)).rep)
यह (पुनरावर्ती सामान्य प्रकार का उपयोग कर, कुछ गंदगी के साथ) कुछ मैं जावा में हासिल किया जाता है। मुझे यकीन है कि स्कैला में कुछ अच्छा करना संभव है।
संपादित
का उपयोग
trait DecBase extends Base {
override type B = DecBase
abstract override val rep= "Dec:"+super.rep
abstract override def copy = new MyBase(rep) with DecBase
}
मैं निम्नलिखित संकलक त्रुटियों
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
println(((new MyBase("ofer") with DecBase)).rep)
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
abstract override def copy = new MyBase(rep) with DecBase
मैंने प्रश्न को परिष्कृत किया है। – user44242
फिर से संपादित, इस बार कंपाइलर त्रुटियों को जोड़ा। मेरे लिए महत्वपूर्ण बात कॉपी विधि के लिए सही वापसी प्रकार है। – user44242
अब मुझे इसे काम करने में परेशानी हो रही है। आरंभ करने के लिए, आप बी को बेसबेस होने के लिए ओवरराइड नहीं कर सकते क्योंकि डेकबेस माइबबेस का उप-प्रकार नहीं है। लेकिन इसे ठीक करने के बाद, मुझे अभी भी एक त्रुटि मिल रही है। कंपाइलर ओवरराइडिंग प्रकार बी = माईबेस पसंद नहीं करता है, लेकिन शायद यह कुछ और हो सकता है। – sblundy