2014-10-10 7 views
7

में अपनी बेस क्लास से एक उप-वर्ग लौट रहा है, मैं उप-वर्ग के एक उदाहरण को वापस करने के लिए एक सुपर क्लास में एक विधि को अनुमति देने की कोशिश कर रहा हूं ताकि मैं माता-पिता और बच्चे दोनों के तरीकों के साथ विधि श्रृंखला का उपयोग कर सकूं।स्विफ्ट

हालांकि, जब मैं विधियों को श्रृंखलाबद्ध करने का प्रयास करता हूं तो मुझे त्रुटि मिल रही है "बेस क्लास में किसी अन्यChainableMethod नामक सदस्य नहीं है"।

class BaseClass { 
    func someChainableMethod() -> BaseClass { 
     return self 
    } 
} 

class ChildClass: BaseClass { 
    func someOtherChainableMethod() -> ChildClass { 
     return self 
    } 
} 

let childClass = ChildClass 

childClass.someChainableMethod().someOtherChainableMethoid() 

मुद्दा यह है कि 'वापसी स्वयं की मूल श्रृंखला में सक्षम विधि में टाइप BaseClass बजाय ChildClass साथ एक उदाहरण लौटा रहा है लगता है: यहाँ मेरी कोड है।

मैं भी जेनरिक के साथ इस की कोशिश की और विफल रहे हैं, यह है कि मैं क्या करने की कोशिश की है:

class BaseClass<T> { 
    func someChainableMethod() -> T { 
     return self 
    } 
} 

class ChildClass: BaseClass<ChildClass> { 
    func someOtherChainableMethod() -> ChildClass { 
     return self 
    } 
} 

let childClass = ChildClass 

childClass.someChainableMethod().someOtherChainableMethoid() 

इस मामले में त्रुटि BaseClasssomeChainableMethod विधि से है, "BaseClass टी के लिए परिवर्तनीय नहीं है।"

उत्तर

8

आपका कोड काम करता है अगर आप Self करने के तरीकों की वापसी प्रकार बदलने के लिए कर सकते हैं बेस क्लास कुछChainableMethod

class BaseClass { 
    func someChainableMethod() -> Self{ 
     return self 
    } 
} 

class ChildClass: BaseClass { 
    override func someChainableMethod() -> Self { 
     return self 
    } 
    func A(){ 

    } 
} 

var objChild = ChildClass() 
objChild.someChainableMethod() 
+0

यह वही है जो मुझे चाहिए, बिल्कुल सही धन्यवाद! :) – user3067870

0

अपनी बेस क्लास में someOtherChaingableMethod जोड़ें और एक खाली कार्यान्वयन छोड़ दिया।

class BaseClass { 
    func someChainableMethod() -> Self { 
     return self 
    } 
} 

class ChildClass: BaseClass { 
    func someOtherChainableMethod() -> Self { 
     return self 
    } 
} 

let childClass = ChildClass() 
let foo = childClass.someChainableMethod().someOtherChainableMethod() 
+0

समस्या यह है कि कुछ अन्यथाable मेथ ओडी विधि वास्तव में ChildClass के लिए विशिष्ट है। विशिष्ट विधियों के साथ कई बाल वर्ग हैं और मैं उनके साथ अपनी बेस क्लास को प्रदूषित नहीं करना चाहता हूं। – user3067870

+0

या आप अपने चेन विधियों को प्रोटोकॉल में निकाल सकते हैं, सभी वर्ग प्रोटोकॉल को कार्यान्वित करें और अपनी श्रृंखला विधि में प्रोटोकॉल का जवाब दें। –

+0

आप विरासत के माध्यम से इसे प्राप्त नहीं कर सकते हैं, इसलिए बेस क्लास बाल वर्ग के तरीकों को नहीं जानता है। अपनी बेस क्लास में सभी चेन विधि को प्रदूषित करें, आप पॉलिमॉर्फिज्म भी कर सकते हैं। –

0

के बाद से आप पहले से ही पता है कि childClass ChildClass का एक उदाहरण है, तो आप

(childClass.someChainableMethod() as ChildClass).someOtherChainableMethoid()