Özel ivar'ları .h dosyasında listeleyen bir Apple sınıfını alt sınıflara ayırırken, alt sınıf uygulamanız için erişilebilir olmasını sağlamak amacıyla alt sınıfın .m dosyasındaki sınıf uzantısında @interface'de kendi alt sınıfınızdaki bu ivar'ları yeniden sınıflandırma tamam mı? ?Bir alt sınıftaki özel ivarları yeniden erişilebilir hale getirmek için tamam mı?
cevap
Bir alt sınıfta bir örnek değişkeni bildirmek kamu arabirimi veya bir sınıf uzantısı olmanın sözde redeclaration bakılmaksızın aynı adı ile varolan üst sınıf örnek değişkeni redeclare etmediğini unutmamak gerekir. Aynı adı kullanıyor olsanız bile, , farklı bir örnek değişkeni'dur.
Bunu kendiniz deneyebilirsiniz.
@interface Base : NSObject {
@private
int _number;
}
@end
@implementation Base
- (id)init { self = [super init]; if (self) _number = 10; return self; }
- (void)logNumber { printf("base = %d\n", _number); }
@end
@interface Derived : Base
@end
@interface Derived() {
int _number;
}
@end
@implementation Derived
- (id)init { self = [super init]; if (self) _number = 20; return self; }
- (void)logNumberDerived { printf("derived = %d\n", _number); }
@end
int main(void) {
Derived *o = [Derived new];
[o logNumber];
[o logNumberDerived];
return 0;
}
çıkışları: Örneğin
base = 10
derived = 20
üst sınıfta _number
alt sınıfı (uzatma) içerisinde _number
farklı olduğu için.
s _OBJC_IVAR_$_Base._number
s _OBJC_IVAR_$_Derived._number
Burada tamamıyla benim maçları cevap bulduk: onlar @private yaptıysanız http://lists.apple.com/archives/cocoa-dev/2007/Feb/msg00939.html
ve bunun bir nedeni olduğunu üstlenmek zorunda kalacağını @protected değil. Sebep bu elbette sadece, geçerli bir sebebi ...
dedi ki, çok kesin değil doğrudan erişmek için OK olabilir değil bilene kadar herşeyin @private yapmak ihtiyatlı var bu olabilir teknik olarak mümkün olsa bile. Eğer kamu/korumalı arayüzünde ihtiyaç işlevselliğini ortaya çıkarmak için üst sınıfın sürdürücü dilekçe ederken yapmakgüvenli şey, kendi sınıfında yeniden yaptığınız her şey etmektir.
Evet: Eğer nm -a
ile ikili çıktıda sembolleri incelemek, derleyici iki farklı semboller üretir olduğunu göreceksiniz. Bu biraz eski ve gerçekten resmi değil, sağlam bir düşünce. –
uchuugaka
- 1. Mapply'ı paralel hale getirmek için verimli bir yol var mı?
- 2. nasıl bir div içindeki görüntü duyarlı hale getirmek için
- 3. Jquery Düğmesi bir formda görünür hale getirmek için
- 4. Çerezleri güvenli hale getirmek mümkün mü?
- 5. .NET: [DataContract] özelliğine sahip bir nesneyi ikili hale getirmek nasıl?
- 6. Hist3 grafik pürüzsüz hale getirmek mümkün mü?
- 7. jQuery'yi jQuery UI olmadan yeniden boyutlandırılabilir hale getirmek için kullanın jQuery UI
- 8. Alt sınıftaki bir yöntemle ve alt sınıftaki yöntemle nasıl geçersiz bir yöntemden dönebilirim?
- 9. Diğer düğmeleri görünür hale getirmek için java'da JToggleButton'u kullanma
- 10. R Parlak: Saydam hale getirmek için ggplot2 arkaplanı kaldırılıyor
- 11. VS uzantam için "Disable"/"Uninstall" düğmesini etkisiz hale getirmek istiyorum
- 12. Bu Haskell kodunu daha zarif hale getirmek için nasıl yeniden açmalıyım?
- 13. Bir belirtme çizgisi grafiği için 9-yama çekilebilir hale getirmek mümkün mü?
- 14. Rails uygulamasında dünya çapında kullanılabilir hale getirmek için özel sınıflar nereye koyabilir?
- 15. nasıl bir düğme iki satır metni hale getirmek ve dikey
- 16. Sağ alt ok için html özel bir karakter var mı?
- 17. Yeniden kullanılabilir kodu denetleyiciler ve modeller için erişilebilir duruma getirme
- 18. Bir alt sınıfa ait olmadığında doxygen, temel sınıftaki dokümanları kullanır mı?
- 19. Bir git projesini klonlamak/kullanıma hazır hale getirmek için bir görev
- 20. Niteliklerde HTML varlıkları kullanmak tamam mı?
- 21. tamam + [NSData dataWithData] çağırmak mı?
- 22. Magento'ya ödeme işlemi tamam mı?
- 23. PEPROCESS değerlerini karşılaştırmak tamam mı?
- 24. VoiceOver: zorlamak bir erişilebilirlik eleman benim iOS uygulaması erişilebilir hale sürecinde olduğum bir ekran geçişi
- 25. Sonunda bir deneme/yakalama yapmak için tamam mı?
- 26. Ana iş parçacığı kapalı bir segue gerçekleştirmek için tamam mı?
- 27. HTTP yönlendirme görüntüleri tamam mı?
- 28. Webhandler'da genel sınıftaki özel alanlara nasıl erişilir?
- 29. Kalıtım: Alt sınıftaki taban sınıf alanlarına erişim
- 30. Alt sınıftaki belirli parametre türü mümkün değil
İlginç. Ancak, eğer başka bir şekilde aynı şekilde beyan edilmişlerse, örneğiniz, süper olarak uygulanan yöntemlerde başvurulan yöntemi gösterir. Alt sınıfta beyan edilen yöntemlerde başvurulan alt sınıfta bildirilen? – uchuugaka
@uchuugaka Doğru. Üst sınıf ivar özel olduğu için, alt sınıf bu ivar'a erişemez ve sadece kendi farklı ivarlarını görür. Üst sınıf ivar'a erişebilmek için fazladan bir çaba sarf etmelisiniz (örneğin, Objective-C çalışma zamanı API'sini kullanarak). –
Onaylandı. Bunu çeşitli varyasyonlar, ayarlayıcılar, alıcılar ve özellikler ile test ettim ve söylediğiniz gibi olabileceğinden eminim. Ve bu davranış, bir ivar sınıfının ivarın bir sınıfı olduğu bir nesne olduğu zaman, "düşünmek" için işe yarayabilirdi. "Düşün" Ben yeniden düşünürdüm ... (evet bu soruya nasıl geldim, ama ayrılmaz C tipi ivar daha net!) – uchuugaka