Objective-C:实例化与自身相同类的对象

时间:2011-03-20 17:12:56

标签: objective-c

我有两个课程:Alpha和Beta。

Beta继承自Alpha。

如何在Alpha中编写一个方法,如果我用类Beta的对象调用它,它将返回一个新的Beta对象?

例如:

- (Alpha *)makeAnother {
  return [[[self class] alloc] init] autorelease];
}

我认为这样可行,但事实并非如此。

4 个答案:

答案 0 :(得分:2)

在这种情况下,将返回类型从Alpha*更改为id。其余的都是对的。

答案 1 :(得分:0)

不确定你在这里尝试做什么,当你使用多态时,最终目标是创建适当的子类Beta,它继承了超类Alpha的所有方法。如果要返回Beta类型的对象,则应在Beta类中声明它。

如果问题是你有循环依赖,那么你可以使用这个小技巧在另一个类中半声明一个必需但尚未声明的类:

@Class Beta;

如果您试图准确描述您尝试对代码执行的操作,那将会有所帮助。

答案 2 :(得分:0)

最简单的方法是编写alpha函数:

- (Alpha *)makeAnother {
   return [[[Alpha alloc] init] autorelease];
}

然后在您的Beta类中覆盖该函数:

- (Alpha *)makeAnother {
   return (Alpha*)[[[Beta alloc] init] autorelease];
}

答案 3 :(得分:0)

- (Alpha *)makeAnother {
  return [[[self class] alloc] init] autorelease];
}

该代码工作正常。没有你定义什么“不起作用”对你意味着什么,很难说更多。

但是,如果您希望这样的模式在不进行强制转换的情况下工作,则应将该方法定义为返回(id)

Beta* b = [someObjectIKnowIsBeta makeAnother];

Objective-C不支持co / contra方差,因此,任何期望返回不同类实例的方法都被声明为返回(id)以避免强制转换。这在框架中很常见。请参阅-dataCell+array+alloc等...