सबसे पहले, आप MatchError
क्यों देख रहे हैं। किसी ऑब्जेक्ट (एएफ) पर एक मान को स्थिर पहचानकर्ता माना जाता है (जैसा कि स्कैला संदर्भ कहता है, "स्थिर सदस्य [...] ऑब्जेक्ट डिफिशन द्वारा प्रस्तुत किए गए सदस्य या गैर-अस्थिर प्रकारों की मान परिभाषाओं द्वारा)"।
object A extends scala.AnyRef {
...
private[this] val f: String = "Object A";
<stable> <accessor> def f: String = A.this.f
}
जब एक काम में इस्तेमाल किया, संकलक पैटर्न मिलान में "desugars" इस स्थिर पहचानकर्ता का काम (यह स्थिर किया जा रहा है एक आवश्यक शर्त है):
यहाँ की तरह क्या टाइपकर्ता उत्पादन लग रहा है
<synthetic> private[this] val x$1: Unit = ("Object B": String("Object B") @unchecked) match {
case A.f =>()
}
यह "ऑब्जेक्ट ए" पैटर्न के खिलाफ "ऑब्जेक्ट बी" से मेल नहीं खाता है, इसलिए यह MatchError
फेंकता है।
अपने बड़े प्रश्न के लिए: आप किसी साथी ऑब्जेक्ट पर मूल्यों और विधियों को ओवरराइड नहीं कर सकते/नहीं करना चाहिए। पॉलिमॉर्फिज्म कक्षाओं और उनके उदाहरणों पर लागू होता है, न कि स्थैतिक तरीकों या मूल्यों के लिए। आपके प्रोग्राम के बारे में सोचने का शायद एक बेहतर तरीका है जिसमें किसी साथी ऑब्जेक्ट पर vals/defs को ओवरराइड करना शामिल नहीं है।
स्रोत
2013-04-30 19:25:52
धन्यवाद! मैं आम तौर पर साथी वस्तुओं को ओवरराइड करने की आवश्यकता पर सहमत हूं, लेकिन कारण यह है कि मैं इसे यहां करना चाहता हूं परीक्षण उद्देश्यों के लिए, जहां मैं किसी अन्य विधि के साथ साथी ऑब्जेक्ट के अंदर एक विधि को प्रतिस्थापित करना चाहता हूं। इसके अलावा, कुछ भाषाएं स्थिर तरीकों को ओवरराइड करने की अनुमति देती हैं। – deepkimo