मैं केवल अपनी कक्षा की परिभाषाओं में आवश्यकताएं (संग्रहीत गुण, इनिशियलाइज़र) रखता हूं और बाकी सभी को अपने आप में स्थानांतरित करता हूं 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मेरे जैसे ग्रुप कोडिंग के लिए एस का उपयोग करना वास्तव में गलत है?