Yalnızca gereksinimleri (depolanmış özellikler, başlatıcılar) sınıf tanımlarıma koyma ve diğer her şeyi kendi başlarına taşıma eğilimindeyim extension, bir tür extensionmantıksal blok gibi gruplayacağım // MARK:.
Örneğin, bir UIView alt sınıfı için, yerleşimle ilgili şeyler için bir uzantı, bir tanesi de abone olmak ve olayları yönetmek için bir uzantı elde ederdim. Bu uzantılarda, kaçınılmaz olarak bazı UIKit yöntemlerini geçersiz kılmam gerekiyor, örn layoutSubviews. Bugüne kadar bu yaklaşımla ilgili herhangi bir sorun fark etmedim.
Örneğin bu sınıf hiyerarşisini ele alalım:
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()
Çıktı A B C. Bu bana biraz mantıklı geliyor. Statik olarak gönderilen Protokol Uzantılarını okudum, ancak bu bir protokol değil. Bu normal bir sınıftır ve yöntem çağrılarının çalışma zamanında dinamik olarak gönderilmesini bekliyorum. Açıkça, çağrı Cen azından dinamik olarak gönderilmeli ve üretilmeli Cmi?
Eğer mirası kaldırırsam NSObjectve Cbir kök sınıf declarations in extensions cannot override yetyaparsam , derleyici , zaten okuduğum şeyi söyleyerek şikayet eder . Fakat NSObjectbir kök sınıfa sahip olmak işleri nasıl değiştirir?
Her iki geçersiz kılmayı da kendi sınıf bildirimlerine A A Ataşımak, beklendiği gibi Büretir A B B, yalnızca A'ürettiği ürünleri C B Ctaşır, yalnızca ' ürettiği ürünleri taşır, bu sonuncusu bana kesinlikle bir anlam ifade etmez: -çıktıyı Aüretmek için statik olarak yazılan bile artık A!
dynamicAnahtar kelimeyi tanıma eklemek veya bir geçersiz kılmak bana istenen davranışı 'sınıf hiyerarşisindeki o noktadan aşağıya doğru' veriyor gibi görünüyor ...
Örneğimizi biraz daha az yapılandırılmış bir şeye değiştirelim, aslında bu soruyu göndermeme neden olan şey:
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()
Şimdi anlıyoruz A B A. Burada UIView'un layoutSubviews'larını hiçbir şekilde dinamik yapamıyorum.
Her iki geçersiz kılmayı da sınıf beyanına taşımak bizi A A Atekrar getirir , sadece A'lar veya sadece B'ler bizi hala alır A B A. dynamicyine sorunlarımı çözer.
Teoride ben eklemek olabilir dynamicherkese overrideşimdiye kadar yapmak s ama burada başka bir şey yanlış yapıyorum gibi hissediyorum.
extensionKodları gruplamak için s kullanmak benim yaptığım gibi gerçekten yanlış mı ?