2013-05-12 31 views
2

新手在這裏試圖理解繼承。如果我使用多個屬性初始化一個新對象,並且我希望其他類可以幫助將值分配給這些屬性,那麼是否需要創建這些其他類的實例?可視化:Objective C幫手方法

-(ObjA *)init{ 
    self = [super init]; 
    self.property1 = [method from Class A]; 
    self.property2 = [method from Class B]; 
    self.property3 = [method from Class C]; etc... 
    return self; 
} 

換句話說,假設A類,B和C需要知道什麼對象A是的,我需要使這些類方法實例方法和初始化的每個對象?還有另外一種方法可以解決這個問題嗎?預先感謝您的幫助。

+2

這不是一個回答你的問題,但總的來說,你的目標應該是你的類的設計使得每個知道少從別人可能。作爲一個例子,_Car_可以知道它需要四個_Wheel_對象,但是車輪對象不需要知道_Car_。我們打破了這個規則,在短期內簡化了事情,並在稍後進行討論。這個規則的主要例外是Cocoa/Foundation類,這些類是你的類知道的。 – aLevelOfIndirection 2013-05-12 06:12:09

回答

6

換句話說,假設類A,B和C需要知道對象A 是

NO


可以簡單地調用從ClassA的/ B/C等的方法,但返回類型必須與相應的property匹配。

令,該property1是一種NSString那麼你ClassA方法必須是

-(NSString *)methodClassA{ 
    ... 
    return someStringValue; 
} 

然後,你需要使用:

ClassA *objClassA=[ClassA new]; 
self.property1=[objClassA methodClassA]; 

或者你可以通過這個與類的方法去:

+(NSString *)methodClassA{ 
    ... 
    return someStringValue; 
} 

,並用它作爲:

self.property1=[ClassA methodClassA]; 
+2

+1甚至僅適用於「** NO。**」部分。 – 2013-05-12 05:01:49

+0

謝謝,這是一個非常有幫助的解釋。 – 2013-05-12 06:23:38

2
assuming Class A, B, and C need to know what Object A is 

對象的初始化代碼應該是自包含的,除非它是使用由不同的對象所擁有的功能,在這種情況下,對象充當的是客戶端功能。也就是說,objectA充當A,B,C的客戶端(如你的代碼所見)。

但這並不意味着A,B,C需要知道(依賴於)objectA。通過這樣做,你就是說他們沒有理由獨立存在。

一般而言,

  • 每個類或方法應當具有一種封裝的目的。這使得易於理解,更改和單獨測試。創建類的唯一目的是封裝信息來創建不同的類,但將它分成三個不同的類是非常常見的模式,這種模式是非常奇怪的(因爲我無法想象這樣的例子)。

  • 不應該允許對象存在於不可用狀態,也不應該在創建它時需要非必要信息。 objectA是否要求這些屬性起作用?如果是這樣,那麼你的代碼是正確的,如果沒有的話,初始化程序提供的信息太多,使得它的可重用性較差。

試着用真實的(而不是抽象的)例子來重新思考你的懷疑。你可能最終會自己理解它。