【问题标题】:Initializing instance object in designated initializer?在指定的初始化程序中初始化实例对象?
【发布时间】:2012-08-02 23:19:55
【问题描述】:

我有一个 Rectangle 类,它具有宽度和高度属性。它还有一个名为 origin (-(XYPoint *) origin ) 的实例属性/对象。下面是我指定初始化程序的代码,其中我将 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 的新手,所以如果我在我的问题中陈述了一些技术上的错误,请原谅我。谢谢!

【问题讨论】:

  • XYPoint类有一个实例方法setX:(int) x andY: (int) y

标签: objective-c object inheritance designated-initializer


【解决方案1】:

就个人而言——我尽量避免使用带参数的初始化程序。我认为这会导致编写更多代码和不灵活。我只为两件事使用指定的初始化器:

  • 使用在对象初始化后不得更改的属性初始化对象
  • 使用构造对象绝对需要且以后无法指定的属性初始化对象

一般来说,对于 Rectangle 类,我会这样使用:

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

// use r

除了上面列出的条件外,根本不使用指定的初始化模式。 (例如,创建不可变的 Rectangle 实例)

最后,可能不需要创建 Rectangle 类——只需使用 CGRect/NSRect 原始结构即可。

【讨论】:

  • 这意味着每次创建Rectangle 时,都需要重复初始化程序中的代码。你有四行,而不是一行。拥有-initWithSize:origin: 会如何导致“编写更多代码”?似乎这会导致整体写作减少。
  • 对我来说,像我的示例这样的代码非常简单。在可能的情况下始终使用普通的init 以避免指定初始化程序的额外复杂性和不灵活性。 IE。让我们决定 Rectangle 应该有一个 backgroundColor 属性...我要添加 initWithSize:origin:backgroundColor: 吗?还是初始化器只覆盖originsize 并稍后设置backgroundColor?还是我有 3 个用于不同排列的初始化程序?等等等等。使用init 可以避免所有这些问题。
  • 对我来说,指定的初始化器是一般规则“init你的对象”的特例。特殊情况 = 复杂性。
猜你喜欢
  • 2013-07-04
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多