如何声明自我类型的变量?

时间:2015-02-26 00:10:14

标签: objective-c factory-pattern instancetype

考虑一下这个构造函数的例子:

+ (instancetype)widgetWithTitle:(NSString *)title
{
    Widget* widget = [[self alloc] init];
    widget.title = title;
    return widget;
}

假设我想动态推断类型,因此当使用此构造函数调用子类时,它们将返回WidgetSubclass*而不是Widget*

我期望typeOf(self) widget = [[self alloc] init]抛出编译器警告。那么我怎么能要求编译器创建指向所调用的任何类型的指针,而不是这个硬编码的超类类型呢? 请注意,我意识到我可以制作initWithTitle:方法并返回[[self alloc] initWithTitle:title],这不是重点。 另请注意,我意识到这实际上并不会妨碍子类中的任何操作设置 - 这只是为了理想。

- 编辑 -

我应该澄清我的意图,因为这个问题没有受到热烈欢迎。目标只是看看是否有一个编译时typeOf机制,我可以用它来声明我当前上下文类型的对象(编译时等效于[self class])。想想instancetype objectOfMyOwnKind = ...typeOf(self) anObjectLikeMe = [self copy]或其他什么。

这不是必然的实际应用。纯粹是一种好奇心。毫无疑问如何实现一个合适的构造函数,如果构造函数是一个红色的鲱鱼,我道歉。

2 个答案:

答案 0 :(得分:0)

  

...我想动态地推断出类型,所以当使用这个构造函数调用我的子类时,它们会返回WidgetSubclass*而不是Widget*

他们已经这样做了,因为这就是instancetype的意思:返回一个消息类的实例。

没有必要“动态输入”这个变量。*为什么?

没有必要,因为超类(定义此方法)不应该具有其子类的特定知识。键入指针以引用子类的唯一原因是使用特定于子类的方法。这是 - 充其量 - 一个可怕的想法。

由于没有必要,没有办法做你所要求的。

超类是此变量的有效且正确的类型。如果您想要更通用的类型,则必须使用id


*或指向当前类实例的任何其他变量(在超类的方法中)。

答案 1 :(得分:-1)

无论是谁投票,都应该考虑他们是否真正了解所要求的内容。

这可能适合你:

BaseClass *instance;
instance = [[self class] new];
instance.title = @"...";