Ö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
İ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