Apa yang setara dengan metode yang dilindungi di Objective-C? Saya ingin mendefinisikan metode yang hanya dapat dipanggil / diterapkan oleh kelas turunan.
objective-c
LK.
sumber
sumber
Anda dapat menyimulasikan akses yang dilindungi dan privat ke metode dengan melakukan hal berikut:
Perlindungan ini, seperti yang dicatat Sachin, tidak diberlakukan pada waktu proses (seperti yang ada di Java, misalnya).
sumber
UIGestureRecognizerSubclass.h
Inilah yang saya lakukan untuk membuat metode terlindungi terlihat oleh subkelas saya, tanpa mengharuskan mereka untuk menerapkan metode itu sendiri. Ini berarti saya tidak mendapatkan peringatan compiler di subclass saya tentang implementasi yang tidak lengkap.
SuperClassProtectedMethods.h (file protokol):
SuperClass.m: (compiler sekarang akan memaksa Anda untuk menambahkan metode yang dilindungi)
SubKelas.m:
sumber
performSelector
melakukannya.[(id)obj hiddenMethod]
. Tepatnya, metode yang dilindungi tidak didukung di Objective-C.Saya baru saja menemukan ini dan itu berhasil untuk saya. Untuk memperbaiki jawaban Adam, dalam superclass Anda membuat implementasi metode yang dilindungi dalam file .m tetapi jangan mendeklarasikannya dalam file .h. Dalam subkelas Anda, buat kategori baru di file .m Anda dengan deklarasi metode superkelas yang dilindungi dan Anda dapat menggunakan metode kelas super yang dilindungi di subkelas Anda. Ini pada akhirnya tidak akan mencegah pemanggil dari metode yang seharusnya dilindungi jika dipaksa pada waktu proses.
sumber
protectedMethod
Cara lain menggunakan variabel @protected.
sumber
Anda bisa mendefinisikan metode sebagai metode privat dari kelas induk dan bisa digunakan
[super performSelector:@selector(privateMethod)];
di kelas anak.sumber
Anda dapat semacam melakukan hal ini dengan kategori.
Metode tidak disembunyikan jika Anda mengimpor kategori di kelas lain, tetapi Anda tidak melakukannya. Karena sifat dinamis Objective-C, sebenarnya tidak mungkin untuk menyembunyikan metode sepenuhnya terlepas dari jenis instance pemanggil.
Cara terbaik untuk melakukannya mungkin adalah kategori kelanjutan kelas seperti yang dijawab oleh @Brian Westphal tetapi Anda harus mendefinisikan ulang metode dalam kategori ini untuk setiap instance subclass.
sumber
Salah satu opsinya adalah menggunakan ekstensi kelas untuk menyembunyikan metode.
Masuk
.h
:Masuk
.m
:sumber
@interface
deklarasi dalam file .m. Anda bisa mendeklarasikan fungsi dan menggunakannya dan itu akan diperlakukan sebagai privat.Saya biasanya memberi nama metode yang dilindungi dengan awalan internal:
sumber