2012-08-02 96 views
0

我有一個Rectangle類,它具有屬性的寬度和高度。它還有一個實例屬性/對象,名爲,原點爲( - (XYPoint *)原點)。下面是我指定的初始化程序的代碼,我將XYPoint對象作爲參數傳遞給它。如果我在該方法中將XYPoint類的屬性作爲參數,然後初始化XYPoint對象併爲其在內部方法中分配內存,那麼是否有方法(或可以)?否則,我必須在我的主程序中創建一個XYPoint對象,並將其作爲參數傳遞,這是一個更多的代碼來輸入。在指定的初始化程序中初始化實例對象?

-(id) initWithWidth:(int)w andHeight:(int)h andOrigin:(XYPoint *)o 
{ 
    self = [super init]; 
    if (self) { 
     [self setWidth: w andHeight: h]; 
     self.origin = o; 
    } 
    return self; 
} 

P.S.-我是新來的編程和Objective C的所以請原諒我,如果我已經指出一些技術上的錯誤在我的問題。謝謝!

+0

XYPoint類有一個實例方法setX:(int)x和Y:(int)y – 2012-08-02 23:21:30

回答

0

個人 - 我儘量避免使用參數的初始值設定項。我認爲這導致寫更多的代碼和僵化。我使用指定的初始化只是兩件事:

  • 初始化的對象與屬性的對象初始化
  • 初始化與絕對需要構建其屬性的對象,不能在以後指定後不得更改

一般來說,Rectangle類,我會做這樣使用:

Rectangle * r = [ [ Rectangle alloc ] init ] ; 
r.x = x ; 
r.y = y ; 
r.origin = o ; 

// use r 

,而不是用在指定的除了上面列出的條件之外,所有的除冰機模式都是如此。 (例如,創建不可變的Rectangle實例)

最後,可能不需要創建Rectangle類 - 只需使用CGRect/NSRect基元結構即可。

+0

這意味着每次創建一個'Rectangle'時,都需要重複初始化器中的代碼。而不是一條線,你有四條。如何讓'-initWithSize:origin:'導致「寫更多的代碼」?似乎會導致整體寫作不夠。 – Caleb 2012-09-24 12:29:34

+0

對我來說,像我這樣的代碼非常簡單。在可能的情況下始終使用普通的'init'可避免指定初始化程序的額外複雜性和靈活性。即讓我們來決定'Rectangle'應該有一個backgroundColor屬性...我添加'initWithSize:origin:backgroundColor:'?或者,初始化器是否稍後使用backgroundColor來覆蓋'origin'和'size'?或者我有3個初始化程序爲不同的排列?等等。使用'init'可以避免所有這些問題。 – nielsbot 2012-09-24 20:10:29

+0

對我來說,指定的初始值設定項是一般規則「'init' your objects」的特殊情況。特殊情況=複雜性。 – nielsbot 2012-09-24 20:13:04