दो चीजें यहाँ पर जा रहे हैं:
- एक समारोह और एक विधि are not the same thing
- तरीके अपने मापदंडों 'प्रकार में बहुरूपी नहीं हैं
आपका tester
विधि एक विधि है , Function1
नहीं। यह अंडरस्कोर सिंटैक्स का उपयोग एक समारोह में उठाया जा सकता है:
val f = (new FooTest[String]).tester _ // Fasel => Bla
यह समारोह अपने इनपुट प्रकार में विपरीत संस्करण होगा। (हालांकि, यह कहने लायक है कि को पैरामीटरकृत नहीं किया जा सकता है और यह भी कहने योग्य है कि Foo
या FooTest
का उदाहरण tester
विधि के लिए फ़ंक्शन ऑब्जेक्ट प्राप्त करने के लिए था। यह निश्चित रूप से पहले अवलोकन से होता है!)
एक फ़ंक्शन एक ऑब्जेक्ट है, इसे ओवरराइड नहीं किया जा सकता है क्योंकि इसका कोई मतलब नहीं है। तरीके ओवरराइड किया जा सकता है। हालांकि, जैसा कि मैंने उपरोक्त कहा है, ओवरराइडिंग विधि के पैरामीटर प्रकारों में बहुलक नहीं है। उदाहरण के लिए:
class A {
def foo(a : Any) = println("A: " + a)
}
class B extends A {
override def foo(s : String) = println("B " + s) //will not compile!
}
दो मेरी उदाहरण में तरीकों से ऊपर दो अलग-अलग तरीके हैं: गतिशील प्रेषण केवल विधि लक्ष्य (अर्थात वस्तु जिस पर यह कहा जा रहा है) पर काम करता है।
उपरोक्त में, उदाहरण के लिए, यदि आप override
घोषणा को हटाते हैं, तो कोड संकलित होगा। आप निम्नलिखित चलाते हैं:
(new B).foo(1) //prints A 1
(new B).foo("s") //prints B s
ऐसा इसलिए, क्योंकि हालांकि दोनों तरीकों foo
कहा जाता है, वे पूरी तरह से अलग अलग तरीकों ( अर्थात मैं अतिभारित है foo
, नहीं अधिरोहित यह) कर रहे हैं।यह सबसे अच्छा माना जाता है कि एक विधि के तर्क '(उनके प्रकार सहित) उस विधि के अद्वितीय नाम का हिस्सा हैं। एक विधि केवल तभी ओवरराइड करती है जब उनके पास बिल्कुल नाम है।
अनिवार्य रूप से आप भ्रमित हो रहे हैं दो अलग और संयुक्त राष्ट्र से संबंधित आपका प्रश्न चीजें हैं जो मैं स्पष्टता के लिए नीचे रख देगा:
Function1
पर विचरण एनोटेशन को परिभाषित क्या यह के लिए इसका मतलब एक फ़ंक्शन किसी अन्य प्रकार का संदर्भ (और इसलिए असाइन किए गए किसी दिए गए प्रकार के संदर्भ में)।
- उप-वर्गों पर विधियों को ओवरराइड किया जा सकता है और भाषा विनिर्देश इस तरह के ओवरराइडिंग के लिए नियमों की रूपरेखा तैयार करता है।
स्रोत
2010-11-28 14:08:24
स्कैला संदर्भ में मैं इसे कहां पढ़ सकता हूं? बस पूर्णता के लिए :) – raichoo
समझ गया: 3.3.1 विधि प्रकार धन्यवाद :) – raichoo
मैंने विधि/फ़ंक्शन तुलना पर एक SO प्रश्न का एक लिंक जोड़ा है। साथ ही, विधि ओवरराइडिंग के बारे में बिट बाइटकोड की परिभाषा का हिस्सा है (यानी क्लास फ़ाइल प्रारूप spec)। हालांकि मुझे लगता है कि स्कैला भाषा का विवरण बताता है कि बाइटकोड विधि में स्कैला विधि "उठाया" कैसे है। –