2013-06-19 11 views

cevap

8

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 
+0

İ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

+0

@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). –

+0

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

3

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 yapmak

güvenli şey, kendi sınıfında yeniden yaptığınız her şey etmektir.

+0

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

İlgili konular