मैं ऐसी परिस्थिति में हूं जहां मुझे किसी अन्य पैकेज में परिभाषित विशेषता में मिश्रण करने की आवश्यकता है। परीक्षण में सहायता के लिए, इस विशेषता में एक संरक्षित विधि पैकेज योग्य है।किसी पैकेज द्वारा एक पैकेज द्वारा संरक्षित विधि को एक अलग पैकेज में
package A {
trait X {
protected[A] def method(arg: Int)
}
}
package B {
class Y extends A.X {
protected[A] def method(arg: Int) { }
}
}
scalac के साथ इस संकलन 2.9.1 पैदावार:
test.scala:9: error: A is not an enclosing class
protected[A] def method(arg: Int) { }
इस में किसी भी अन्य पहुँच संशोधक परिणाम के लिए "सुरक्षित [एक]" वर्ग में वाई बदलना:
यहाँ एक उदाहरण हैtest.scala:9: error: overriding method method in trait X of type (arg: Int)Unit;
method method has weaker access privileges; it should be at least protected[A]
override protected def method(arg: Int) { }
मेरा प्रश्न यह है: विशेषता एक्स की परिभाषा मानना नहीं बदल सकता है, क्या कक्षा वाई में कोई बदलाव है जो इसे एक्स एक्स का विस्तार करने की अनुमति देगा? ('संरक्षित' पहुंच के कुछ स्तर को बनाए रखते हुए)
यदि यह संभव नहीं है, तो क्या इसके आसपास काम करने के लिए कोई अन्य अनुशंसित डिजाइन रणनीतियां हैं? ('विधि' सार्वजनिक बनाने के अलावा)
मुझे यह जोड़ना चाहिए कि मैं सरल सवाल का जवाब देने की कोशिश कर रहा हूं कि यह डिज़ाइन द्वारा असंभव है, जैसे कि "सुरक्षित [ए] 'को' सार्वजनिक 'में बदलने का एकमात्र (सरल) तरीका है। पैकेज की परवाह किए बिना यह एक उप-वर्ग की तरह लगता है? या नहीं? – nu11ptr
यह 'सही' समाधान की तरह दिख रहा है, कक्षा कक्षा की परिभाषा को एक वर्ग और एक विशेषता में तोड़ना है। मैं विशेषता को ए के उप-पैकेज में रखूंगा, वहां 'विधि' को परिभाषित करूँगा, और उसके बाद इसे कक्षा वाई के साथ मिलाएं। वास्तविक दुनिया में, ए 'मार्केटडाटा' है और बी 'ब्रोकर' है, इसलिए यह समझ में आता है जब हमारे पास अंततः ब्रोकर उदाहरण होता है जो इस कार्यक्षमता को विभाजित करने के लिए एक डेटा प्रदाता भी है, इसे मार्केटडाटा के उप-पीकेजी में डाल दें, और इसे मिलाएं। यह शायद एक बेहतर डिजाइन है, क्योंकि वे दो पूरी तरह से अलग चिंताओं हैं (ऑर्डर हैंडलिंग बनाम बाजार डेटा)। – nu11ptr