Saya cenderung hanya menempatkan kebutuhan (properti yang disimpan, inisialisasi) ke dalam definisi kelas saya dan memindahkan semua yang lain ke dalam mereka sendiri extension
, semacam seperti extension
per blok logis yang akan saya kelompokkan // MARK:
juga.
Untuk subkelas UIView misalnya, saya akan berakhir dengan ekstensi untuk hal-hal yang berhubungan dengan tata letak, satu untuk berlangganan dan menangani acara dan sebagainya. Dalam ekstensi ini, saya pasti harus mengganti beberapa metode UIKit, misalnya layoutSubviews
. Saya tidak pernah melihat ada masalah dengan pendekatan ini - sampai hari ini.
Ambil hierarki kelas ini sebagai contoh:
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()
Outputnya adalah A B C
. Itu tidak masuk akal bagi saya. Saya membaca tentang ekstensi protokol yang dikirim secara statis, tetapi ini bukan protokol. Ini adalah kelas reguler, dan saya berharap pemanggilan metode secara dinamis dikirim saat runtime. Jelas panggilan pada C
setidaknya harus secara dinamis dikirim dan diproduksi C
?
Jika saya menghapus warisan dari NSObject
dan membuat C
kelas root, kompiler mengeluh mengatakan declarations in extensions cannot override yet
, yang sudah saya baca. Tetapi bagaimana memiliki NSObject
sebagai kelas dasar mengubah banyak hal?
Pindah kedua menimpa ke deklarasi kelas mereka menghasilkan A A A
seperti yang diharapkan, bergerak hanya B
's menghasilkan A B B
, bergerak hanya A
' s menghasilkan C B C
, yang terakhir yang membuat benar-benar tidak masuk akal bagi saya: bahkan tidak satu statis diketik untuk A
menghasilkan A
-Output lagi!
Menambahkan dynamic
kata kunci ke definisi atau override tampaknya memberi saya perilaku yang diinginkan 'dari titik itu dalam hierarki kelas ke bawah' ...
Mari kita ubah contoh kita menjadi sesuatu yang sedikit kurang dibangun, apa yang sebenarnya membuat saya memposting pertanyaan ini:
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()
Sekarang kita dapatkan A B A
. Di sini saya tidak dapat membuat layoutSubviews UIView menjadi dinamis dengan cara apa pun.
Memindahkan kedua penimpaan ke dalam deklarasi kelas mereka membuat kita A A A
lagi, hanya A atau hanya B yang masih membuat kita A B A
. dynamic
lagi memecahkan masalah saya.
Secara teori saya bisa menambahkan dynamic
semua yang override
pernah saya lakukan tetapi saya merasa seperti melakukan sesuatu yang salah di sini.
Apakah benar salah menggunakan extension
kode pengelompokan seperti yang saya lakukan?