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 extension
mantı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ı C
en azından dinamik olarak gönderilmeli ve üretilmeli C
mi?
Eğer mirası kaldırırsam NSObject
ve C
bir kök sınıf declarations in extensions cannot override yet
yaparsam , derleyici , zaten okuduğum şeyi söyleyerek şikayet eder . Fakat NSObject
bir 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 A
taşımak, beklendiği gibi B
üretir A B B
, yalnızca A
'ürettiği ürünleri C B C
taşı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
!
dynamic
Anahtar 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 A
tekrar getirir , sadece A'lar veya sadece B'ler bizi hala alır A B A
. dynamic
yine sorunlarımı çözer.
Teoride ben eklemek olabilir dynamic
herkese override
şimdiye kadar yapmak s ama burada başka bir şey yanlış yapıyorum gibi hissediyorum.
extension
Kodları gruplamak için s kullanmak benim yaptığım gibi gerçekten yanlış mı ?