2014-03-31 70 views
2

我只是想確保我對財產繼承的理解是正確的。我目前正在試圖製作一個UIViewController的子類。在我的UIViewController我所有的網點,如在像這樣實現部分聲明:Objective-C私有財產繼承

@interface BaseClass() 

@property (weak, nonatomic) IBOutlet UILabel *scoreLabel; 

@end 

因此這些屬性然後私人的,對嗎?現在,當我嘗試創建一個子類並使用我的getter和setter訪問這些屬性時,我無法從我的子類訪問它們。在我的子類的實現部分中重新聲明這些屬性的正確形式是這樣嗎?

@interface SubClass() 

@property (weak, nonatomic) IBOutlet UILabel *scoreLabel; 

@end 

我想我可以這樣做,但後來我覺得它毀了繼承的目的。什麼是正確的方式/我做錯了什麼?

+2

您是「確定與做這種方式」 ** **提供你從來沒有直接引用屬性支持變量。你正在做的是創建兩個不同的屬性,每個屬性都有自己的支持變量。但是,由於在SubClass的一個實例中覆蓋了對屬性的任何引用,所以即使從'BaseClass'中定義的方法引用子類屬性。但是,如果在'BaseClass'方法中直接引用屬性支持變量,它將不會更改'SubClass'實例的屬性值...請參閱其他方法的@InsertWittyName答案。 – CRD

回答

1

我會在BaseClass的公共接口中聲明該屬性 - 我沒有看到任何理由將它們放入類擴展中。

@interface BaseClass : UIViewController 

@property (weak, nonatomic) IBOutlet UILabel *scoreLabel; 

@end 

@interface SubClass : BaseClass 

// No need to redeclare the property as you're inheriting it. 

@end 

[編輯]

如果你必須使用類擴展,那麼你可以使用一個專用的標題來實現相同的。

公共報頭的BaseClass(BaseClass.h)

@interface BaseClass : UIViewController 

@end 

私人報頭的BaseClass(BaseClass的-Private.h)

@interface BaseClass() 

@property (weak, nonatomic) IBOutlet UILabel *scoreLabel; 

@end 

公共標題爲子類(子類.h)

#import "SubClass.h" 

@interface SubClass : BaseClass 

@end 

子類(SubClass.m)的實施

#import "BaseClass-Private.h" 

@implementation SubClass 

@end 
+0

這是有道理的。只是在我一直遵循的系列講座中,UI屬性總是被放在類擴展中,所以我不確定這是否是普遍的做法。你能評論這個嗎? – user1217248

+0

這是個人決定,我想說,有些人喜歡將IBOutlets放在類擴展中,因爲它們是實現細節,其他人則將它們放在公共接口中。我將編輯並添加關於如何在保持類擴展名的同時執行此操作的信息。 – InsertWittyName

+0

看起來不錯。感謝你的回答! – user1217248