【问题标题】:How can I declare a variable of self type?如何声明 self 类型的变量?
【发布时间】:2015-04-28 05:25:55
【问题描述】:

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

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

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

我对@9​​87654324@ 的期望会引发编译器警告。那么我怎样才能让编译器创建一个指向正在调用的任何类型的指针,而不是这个硬编码的超类类型呢? 请注意,我意识到我可以创建一个initWithTitle: 方法并返回[[self alloc] initWithTitle:title],这不是重点。 另请注意,我意识到这实际上不会妨碍子类中的任何操作设置——这只是为了理想。

-- 编辑--

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

这不一定是实际应用。纯属好奇。毫无疑问如何实现一个正确的构造函数,如果构造函数是一个红鲱鱼,我很抱歉。

【问题讨论】:

  • 你的代码完全没问题。
  • 你了解什么是继承吗? (没有必要做你想做的事。)
  • 阅读说明。是的,代码很好!是的,我理解继承!这种模式有效并且对我的代码的执行没有任何影响。我只是想知道生成当前类类型的类的机制(即,如果有一个用于强引用的 typeOf() 方法,就像对于 weakSelf 模式那样)。我已经使用 Objective-C 很多年了,只是为了满足今天出现的一些切向的好奇心。
  • “那么我怎样才能让编译器创建一个指向正在调用的任何类型的指针,而不是这个硬编码的超类类型呢?”这确实创建被调用的任何类型。这个不是为超类硬编码的。
  • 您的澄清毫无意义。您无法在编译时完成运行时工作。

标签: objective-c factory-pattern instancetype


【解决方案1】:

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

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

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

没有必要,因为超类(定义这个方法)不应该知道它的子类。键入指针以引用子类的唯一原因是使用特定于子类的方法。这是 - 充其量 - 一个糟糕的主意。

既然没有必要,就没有办法按照你的要求去做。

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


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

【讨论】:

    【解决方案2】:

    对这个问题投反对票的人应该考虑他们是否真的理解所问的问题。

    这可能对你有用:

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

    【讨论】:

    • 感谢您完整阅读说明并理解我的立场。不过,您提供的此代码与我上面的代码相同。它运行良好,并且是在 Objective-C 中实现工厂方法的事实上的方式!它只是没有回答我正在寻找的特定细微差别。
    • 只是引用上面but I want to dynamically infer the type, so when my subclasses are called with this constructor, they return a WidgetSubclass* instead of Widget*.的问题。这不是您的代码已经实现的目标吗?
    • 嗯,有点。当子类FooWidget 用超类方法widgetWithTitle 实例化时,它仍将被键入为FooWidget,因为[[self alloc] init...] 将为上下文实例化正确的类。我只是好奇是否可以使用编译器将变量声明为当前类的类型。我认为构造函数的例子给人们带来了巨大的红鲱鱼。一个不同的例子可能会让我的意图更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多