मैं तेजी से सीख रहा हूँ। मैं सामान्य वर्ग में जेनेरिक फ़ंक्शन को ओवरराइड करना चाहता हूं।जेनेरिक वर्ग में जेनेरिक विधि को तेजी से कैसे ओवरराइड करें?
जब मैं override
कीवर्ड लिखता हूं, तो संकलन त्रुटि होती है।
class GenericParent<U> {
func genericFunc<T>(param: T) { print("parent") }
}
class AbsoluteChild: GenericParent<Int> {
override func genericFunc<T>(param: T) { print("child") }
// ! Method does not override any method from its superclass (compile error)
}
मैं override
कीवर्ड छोड़ सकता हूं। लेकिन जब मैं ऑब्जेक्ट प्रकार को "अभिभावक" के रूप में घोषित करता हूं, तो माता-पिता की विधि को (बाल विधि नहीं) कहा जाता है। यह सचमुच "ओवरराइडिंग" नहीं है।
class GenericParent<U> {
func genericFunc<T>(param: T) { print("parent") }
}
class AbsoluteChild: GenericParent<Int> {
func genericFunc<T>(param: T) { print("child") }
}
var object: GenericParent<Int>
object = AbsoluteChild()
object.genericFunc(1) // print "parent" not "child"
// I can call child's method by casting, but in my developing app, I can't know the type to cast.
(object as! AbsoluteChild).genericFunc(1) // print "child"
इस उदाहरण में, मैं object.genericFunc(1)
के परिणामस्वरूप "बच्चा" प्राप्त करना चाहते हैं।
मैं इस प्राप्त कर सकते हैं (दूसरे शब्दों में, मैं "ओवरराइड" विधि। करना चाहते हैं)? क्या यह हासिल करने के लिए कोई कामकाज है?
मुझे पता है कि मैं कास्टिंग करके बच्चे की विधि को कॉल कर सकता हूं। लेकिन वास्तविक ऐप में मैं विकास कर रहा हूं, मुझे इस प्रकार कास्ट नहीं पता है क्योंकि मैं इसे पॉलिमॉर्फिक बनाना चाहता हूं।
मैंने Overriding generic function error in swift पोस्ट भी पढ़ा, लेकिन मैं इस समस्या को हल नहीं कर सका।
धन्यवाद!
कह 'object' एक' GenericParent है 'केवल संकलक को बता रहा है कि कौन से तरीके और गुण उपलब्ध हैं। यह कक्षा को 'AbsoluteChild' से' जेनेरिक पेरेंट 'में नहीं बदलता है। 'जेनेरिकपैंट ' 'जेनेरिकफनक' विधि उपलब्ध कराता है, लेकिन 'ऑब्जेक्ट' अभी भी एक 'AbsoluteChild' है; जिसका अर्थ है कि जब आप 'जेनेरिक फनक' कहते हैं, तो यह बच्चे के कार्यान्वयन को बुलाएगा। माता-पिता के कार्यान्वयन के लिए आप वस्तु को अपने मूल वर्ग में नहीं डाल सकते हैं। –
keithbhunter
धन्यवाद! लेकिन जब मैं playground पर दूसरा नमूना निष्पादित करता हूं, 'object.genericFunc (1)' प्रिंट "अभिभावक"। इसका मतलब है कि माता-पिता के कार्यान्वयन को बुलाया जाता है। मैं इसे कैसे समझ सकता हूं? –
ओह, मैं भी उसे देखता हूं। यह एक बग की तरह लगता है। आप इसे [bugreport.apple.com] (https://bugreport.apple.com) या [स्विफ्ट गिटहब पेज] पर एक बग के रूप में सबमिट कर सकते हैं (https://github.com/apple) – keithbhunter