2015-09-23 13 views
6

में प्रोटोकॉल एक्सटेंशन विधि प्रेषण प्रोटोकॉल विधियों प्रेषण के संबंध में मुझे एक समस्या का सामना करना पड़ रहा है।स्विफ्ट 2.0

मैं एक वर्ग पदानुक्रम है कि उस तरह दिखता है:

protocol E { 
    func test() 
} 

extension E { 
    func test() { 
     print("jello") 
    } 
} 

class A: E { 

} 

class B: A { 
    func test() { 
     print("hello") 
    } 
} 

लेकिन जब मैं कक्षा B का एक उदाहरण पर test फोन स्थिर A लिखा जाता है, "jello" मुद्रित हो जाता है, नहीं "हैलो" मजबूर कर दिया।

let b: A = B() // prints "jello" not "hello" 
b.test() 

मेरे समझ के साथ कि test विधि मुद्रण "jello" "एकीकृत" हो जाता है A के उदाहरण में (के बाद से AE प्रोटोकॉल के अनुरूप है) है। मैं के अंदर test का एक और कार्यान्वयन प्रदान कर रहा हूं (जो A बनता है)। मैंने सोचा कि पॉलिमॉर्फिज्म यहां काम करेगा और पर B पर A संदर्भों के अंदर संग्रहीत उदाहरण hello प्रिंट करेगा। यहाँ क्या हो रहा है?

यह पूरी तरह से काम कर रहा है जब किसी भी प्रोटोकॉल का उपयोग नहीं:

class A { 
    func test() { 
     print("jello") 
    } 
} 

class B: A { 
    override func test() { 
     print("hello") 
    } 
} 

let b: A = B() // prints "hello" 
b.test() 

क्या एक प्रोटोकॉल है कि मेरे माता-पिता वर्ग के लिए नए तरीकों को कहते हैं अपनाने और एक उपवर्ग में एक नया कार्यान्वयन उपलब्ध कराने के सीधे इस विधि में लिखा होने से, से अलग है अभिभावक वर्ग और फिर इसे उप-वर्ग में ओवरराइड करना?

क्या आपके पास कोई कामकाज है?

+0

सटीक व्यवहार नहीं जो आप देख रहे हैं, लेकिन निकट से संबंधित: http://nomothetis.svbtle.com/the-ghost-of-swift-bugs- भविष्य –

उत्तर

3

एक बग की तरह बदबू आ रही है।

केवल वैकल्पिक हल मैं के साथ आया था बहुत बदसूरत था ...

protocol E { 
    func test() 
} 

func E_test(_s: E) { 
    print("jello") 
} 

extension E { 
    func test() { E_test(self) } 
} 

class A: E { 
    func test() { E_test(self) } 
} 

class B: A { 
    override func test() { 
     print("hello") 
    } 
} 

let b: A = B() 
b.test() 
+0

यह वास्तव में एक समाधान है , लेकिन बहुत बदसूरत :) सुनिश्चित करने के लिए बस एक रडार फाइल करेंगे। –

+0

यह एक बग नहीं है, यह इरादा व्यवहार है। फिर भी, मैं अभी भी इस मुद्दे से लड़ रहा हूं :) – manmal

+0

@manmal अगर ऐप्पल इसका इरादा रखता है, फिर भी सभी प्रोग्रामर इसे उलझन में पाते हैं और इसके आसपास हैकिंग समाप्त करते हैं, तो मुझे लगता है कि इसे एक बग के रूप में वर्गीकृत किया जा सकता है। – mogelbuster

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