簡體   English   中英

Objective-C:繼承受保護/私有原子屬性

[英]Objective-C: inheriting protected/private atomic property

說,我有C,D類,它們的定義如下:

@interface C:NSObject 
@end

@interface D:C 
@end

我的目標是原子屬性P添加到C類以這樣的方式,也只會是可見的和可用d內部類(及其衍生物)。

最好的方法是什么?

PS該屬性必須在D中是原子的。

在Objective-C中,沒有直接支持受保護的屬性或方法。 但是,有一種慣例可以做到這一點。 像抽象方法一樣-如果有人願意,他可以輕松地違反它。

您可以在.m文件中定義要保護的屬性。

@interface DemoObject ()
    @property NSString *protectedString;
@end

@implementation DemoObject
    //implementation of the class
@end

該屬性是原子的 -這是默認設置。

然后,您從DemoObject繼承:

.h文件

@interface InheritingObject : DemoObject

@end

.m文件

@interface DemoObject ()

    @property NSString *protectedString;

@end

@implementation InheritingObject
- (instancetype)init {
    if (self == [super init]) {
        self.protectedString = @"Some String";
    }

    return self;
}
@end

基本上發生的事情是,我們創建了DemoObject的擴展,將擴展DemoObject的屬性暴露給InheritingObject 使用DemoObject任何對象都看不到protectedString屬性,因為它沒有在其.h文件中定義。 看到屬性的類是定義DemoObject擴展的類。

實際上,您可以通過這種方式將屬性公開給任何類,而不僅僅是派生類。 因此很容易打破這一約定。 但是,它會產生某種順序,並產生一種受保護范圍的錯覺。

您可以不用重復進行操作,因此更容易處理:

CH:

@interface C : NSObject
…
@end

創建另一個頭文件:

C_Protected:

@interface C()
@property id protecedVisibility;
@end

厘米

@import "C.h"
@import "C_Protected.h" // You have to do this for correct implementation

DM:

#import "C.h"
#import "C_Protected.h"

然后,您可以輕松地編輯受保護的部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM