2012-08-02 107 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