2016-07-14 9 views
7

मैं तेजी से सीख रहा हूँ। मैं सामान्य वर्ग में जेनेरिक फ़ंक्शन को ओवरराइड करना चाहता हूं।जेनेरिक वर्ग में जेनेरिक विधि को तेजी से कैसे ओवरराइड करें?

जब मैं 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 पोस्ट भी पढ़ा, लेकिन मैं इस समस्या को हल नहीं कर सका।

धन्यवाद!

+0

कह 'object' एक' GenericParent है 'केवल संकलक को बता रहा है कि कौन से तरीके और गुण उपलब्ध हैं। यह कक्षा को 'AbsoluteChild' से' जेनेरिक पेरेंट 'में नहीं बदलता है। 'जेनेरिकपैंट ' 'जेनेरिकफनक' विधि उपलब्ध कराता है, लेकिन 'ऑब्जेक्ट' अभी भी एक 'AbsoluteChild' है; जिसका अर्थ है कि जब आप 'जेनेरिक फनक' कहते हैं, तो यह बच्चे के कार्यान्वयन को बुलाएगा। माता-पिता के कार्यान्वयन के लिए आप वस्तु को अपने मूल वर्ग में नहीं डाल सकते हैं। – keithbhunter

+0

धन्यवाद! लेकिन जब मैं playground पर दूसरा नमूना निष्पादित करता हूं, 'object.genericFunc (1)' प्रिंट "अभिभावक"। इसका मतलब है कि माता-पिता के कार्यान्वयन को बुलाया जाता है। मैं इसे कैसे समझ सकता हूं? –

+0

ओह, मैं भी उसे देखता हूं। यह एक बग की तरह लगता है। आप इसे [bugreport.apple.com] (https://bugreport.apple.com) या [स्विफ्ट गिटहब पेज] पर एक बग के रूप में सबमिट कर सकते हैं (https://github.com/apple) – keithbhunter

उत्तर

0

objectGenericParent<Int> के रूप में घोषित करके आप इसे सुपरक्लास का उदाहरण मानते हैं।

यदि आप अभी तक नहीं जानते हैं कि आपका प्रकार रनटाइम पर क्या होगा, तो आप एक सामान्य सुपरक्लास के बजाय प्रोटोकॉल का उपयोग करने पर विचार कर सकते हैं। प्रोटोकॉल में आप जिस ऑब्जेक्ट की अपेक्षा करते हैं उसकी आवश्यकताओं को परिभाषित कर सकते हैं।

protocol MyObjectType { 
    func genericFunc<T>(param: T) ->() 
} 

class AbsoluteChild: MyObjectType { 
    func genericFunc<T>(param: T) { 
     print("hello world") 
    } 
} 

var object: MyObjectType 
object = AbsoluteChild() 
object.genericFunc(1)// prints "hello world" 

आप अभी भी एक डिफ़ॉल्ट कार्यान्वयन की जरूरत है, जैसे आप अपने मूल सुपर क्लास GenericParent में करना होगा, तो आप कि इतने की तरह एक प्रोटोकॉल विस्तार में कर सकते हैं:

extension MyObjectType { 
    func genericFunc<T>(param: T) { 
    print("default implementation") 
    } 
} 

class AnotherObject: MyObjectType { 
    //... 
} 

var object2: MyObjectType 
object2 = AnotherObject() 
object2.genericFunc(1)// prints "default implementation" 
+0

क्या यह वास्तव में अंत में "डिफ़ॉल्ट कार्यान्वयन" प्रिंट करता है? जहां तक ​​मैं सवाल समझता हूं, वह उस बिंदु पर "हैलो वर्ल्ड" चाहता है। – jboi

+0

पहले कोड भाग में यह "हैलो वर्ल्ड" प्रिंट करता है। दूसरे भाग में मैंने जो जोड़ा, उसे डिफ़ॉल्ट कार्यान्वयन की भी आवश्यकता है जैसे वह अपने सामान्य सुपरक्लास में करेगा। – Juul

संबंधित मुद्दे