मैं केवल अपनी कक्षा की परिभाषाओं में आवश्यकताएं (संग्रहीत गुण, इनिशियलाइज़र) रखता हूं और बाकी सभी को अपने आप में स्थानांतरित करता हूं extension
, एक extension
तार्किक ब्लॉक की // MARK:
तरह।
उदाहरण के लिए एक UIView उपवर्ग के लिए, मैं लेआउट-संबंधित सामान के लिए एक एक्सटेंशन के साथ, एक को आगे बढ़ने और घटनाओं को संभालने और संभालने के लिए समाप्त करूंगा। इन एक्सटेंशनों में, मुझे अनिवार्य रूप से कुछ UIKit विधियों को ओवरराइड करना है, जैसे layoutSubviews
। मैंने कभी भी इस दृष्टिकोण के साथ किसी भी मुद्दे पर ध्यान नहीं दिया - आज तक।
उदाहरण के लिए इस वर्ग पदानुक्रम को लें:
public class C: NSObject {
public func method() { print("C") }
}
public class B: C {
}
extension B {
override public func method() { print("B") }
}
public class A: B {
}
extension A {
override public func method() { print("A") }
}
(A() as A).method()
(A() as B).method()
(A() as C).method()
आउटपुट है A B C
। इससे मुझे कोई मतलब नहीं है। मैंने प्रोटोकॉल एक्सटेंशन के बारे में स्टेटिकली डिस्पैच होने के बारे में पढ़ा, लेकिन यह प्रोटोकॉल नहीं है। यह एक नियमित कक्षा है, और मुझे उम्मीद है कि विधि कॉल को गतिशील रूप से रनटाइम पर भेजा जाएगा। स्पष्ट रूप से कॉल को C
कम से कम गतिशील रूप से भेजा जाना चाहिए और उत्पादन करना चाहिए C
?
यदि मैं विरासत को हटा देता हूं NSObject
और C
एक मूल वर्ग बनाता हूं , तो कंपाइलर यह कहते हुए शिकायत करता है declarations in extensions cannot override yet
, जिसे मैंने पहले से ही पढ़ा है। लेकिन NSObject
एक जड़ वर्ग के रूप में चीजों को कैसे बदलता है?
अपने वर्ग घोषणा में दोनों ओवरराइड चलती का उत्पादन A A A
की उम्मीद के रूप में, केवल आगे बढ़ B
's पैदा करता है A B B
, केवल आगे बढ़ A
रहा है पैदा करता है C B C
, जिनमें से आखिरी मेरे लिए बिल्कुल नहीं समझ में आता है: नहीं एक भी स्थिर लिखे गए A
पैदा करता है A
आउटपुट किसी भी अधिक!
dynamic
कीवर्ड को परिभाषा या एक ओवरराइड में जोड़ने से मुझे कक्षा पदानुक्रम में उस बिंदु से 'वांछित व्यवहार' देना प्रतीत होता है ...
आइए हमारे उदाहरण को कुछ कम निर्मित निर्माण में बदलें, जिसने वास्तव में मुझे इस प्रश्न का उत्तर दिया:
public class B: UIView {
}
extension B {
override public func layoutSubviews() { print("B") }
}
public class A: B {
}
extension A {
override public func layoutSubviews() { print("A") }
}
(A() as A).layoutSubviews()
(A() as B).layoutSubviews()
(A() as UIView).layoutSubviews()
अब हम मिल गए A B A
। यहाँ मैं किसी भी तरह से UIView के लेआउटसुबानों को गतिशील नहीं बना सकता।
दोनों को अपनी कक्षा की घोषणा में आगे ले जाने से हमें A A A
फिर से केवल A या केवल B की प्राप्ति होती है A B A
। dynamic
फिर से मेरी समस्याओं को हल करता है।
सिद्धांत रूप में मैं उन dynamic
सभी को जोड़ सकता override
हूं जो मैं कभी भी करता हूं लेकिन मुझे ऐसा लगता है कि मैं यहां कुछ और गलत कर रहा हूं।
क्या extension
मेरे जैसे ग्रुप कोडिंग के लिए एस का उपयोग करना वास्तव में गलत है?