2013-09-30 78 views
0

試圖使我的OOP基礎強大基於目標C.對不起,如果我的解釋太長。 我在我的應用程序中有3類作爲A類,B類和C類客觀C類。 我有A級的屬性我在執行B類即它使B類的私有財產私人v/s目標C中的公共類屬性

// implementation Class B 
@interface ClassB() 
    @property (nonatomic, strong) ClassA *classA; 
@end 

我在我的C類方法之一創建B類的一個實例,並且嘗試訪問A級通過B類的實例屬性類C.

// implementation Class C 
@interface ClassC() 
    @property (nonatomic, strong) ClassB *classB; 
@end 

@implementation ClassC 
- (void)someMethod 
{ 
    NSString *string = [[NSString alloc] init]; 
    classB = [[ClassB alloc] init]; 
    string = classB.classA.displayString; //get an error here - ClassB doesn't have classA. 
} 
@end 

要避免錯誤我感動的ClassA的財產實施ClassB的到頭。

// header Class B 
@interface ClassB : NSObject 
    @property (nonatomic, strong) ClassA *classA; 
@end 

但我擔心有人類可以創建B類,接入CLASSA屬性的實例,然後可以使用/修改的是A類的部分屬性

問題:將classA屬性移動到Class B的頭文件中是否是一種很好的樣式,所以我可以在Class C中使用它,或者我應該在Class B中創建一個方法,它會返回我從A類所需的任何內容?喜歡的東西:

@implementation ClassB 
- (NSString*)displayStringOfClassA 
{ 
    classA = [[ClassA alloc] init]; 
    return self.classA.displayString; 
} 
@end 

回答

0

我會建議在ClassB.h只讀字符串屬性。

ClassB.h:

@property (nonatomic, readonly) NSString *classAString; 

ClassB的。L:

- (NSString *) classAString 
{ 
    return self.classA.displayString; 
} 

這可以作爲您需要的特定字符串「消氣」的方法,並避免讓其他人訪問CLASSA。

編輯:

其他建議增加CLASSA在ClassB.h只讀屬性。這仍然允許修改classA屬性,它只會保證classA不會被重新分配給另一個ClassA實例。

+0

我正在研究readonly屬性在客觀C中的工作原理。如果它的只讀屬性允許修改,那麼我喜歡爲字符串創建方法的樣式。但是假設A類有7個與顯示字符串類似的屬性,並且我想要訪問它們,那麼編寫返回所有7個屬性的方法將需要很多代碼。附:我不是在判斷,只是想了解更多。 :) –

+0

只讀意味着只有getter方法可見,而不是該屬性的setter。但是,除非您只是將所有屬性設置爲只讀,否則setter對於ClassA屬性仍然存在。所以另一個類可以做classB.classA.classAProperty = somethingThatYouDoNotWant; – paulrehkugler

+0

我試了一下,你是真的。即使readOnly也可以訪問classA的其他屬性並進行更改。在我的C類中,我嘗試了classB.classA.someOtherProperty = @「更改它」,它確實接受並更改了屬性值。 –

1

在ClassB.h:

@interface ClassB: NSObject 
    @property (nonatomic, strong, readonly) ClassA *classA; 
@end 

在ClassB.m:

@interface ClassB() 
    @property (nonatomic, strong, readwrite) ClassA *classA; 
@end 

此外,strongreadwrite是默認功能鍵 - 你可以擺脫他們。但是,它們可以提高代碼的可讀性。
編輯:如果你想禁止訪問的ClassA屬性 - 做同樣的把戲。建議的上述代碼將禁止修改classB的classA屬性。對於ClassA的的displayString:
在ClassA.h:

@interface ClassA: NSObject 
    @property (nonatomic, strong, readonly) NSString *displayString; 
@end 

在ClassA.m:

@interface ClassA() 
    @property (nonatomic, strong, readwrite) NSString *displayString; 
@end 
+0

那麼'strong'是ARC範圍內的默認值,'nonARC範圍內的'assign'。當然這都是關於可保留的類型(對象)。現在都好嗎? –

+0

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#property-declarations實際上 –

+0

要清楚的是,在ARC中'strong'是對象類型的默認語義,否則'assign'是默認的。 – jlehr

0

string = objectB.objectA.displayString;東西違反了Law of Demeter。根據Demeter法進行設計會產生更易維護和適應性強的軟件。

你應該總是試着不要跟陌生人交談。這是在你的例子:self談判objectBobjectB談判objectAself不應該談到objectA,因爲它是一個陌生人。

1

聽起來像你想要的「框架」,而不是「私人」@property()聲明。

要做到這一點,像創建一個文件:

ClassA_Private.h

包含您@property()聲明。

然後#import "ClassA_Private.h"兩個你ClassA.m(前@implementation),並在希望使用@property任何子類。

這是創建類擴展時的二次設計考慮;增加了在子類和/或框架內完全可訪問的聲明的功能,而不需要外部公開。儘管您無法爲iOS目標應用程序創建框架,但仍然適用相同的功能。