2

SKNode 只提供+node方法。

如果你这样做:

+ (instancetype)node {
    CustomNode *body = [CustomNode node]; // infinite loop
}

如果你这样做:

+ (instancetype)node {
    CustomNode *body = [super node]; // instance of SKNode, not CustomNode
}

您如何子类化一个只有便利构造函数的类,以便您可以覆盖构造函数?还是创建自己的+customNode方法是最佳实践?

4

3 回答 3

7

没有人说你不能[... alloc] init]在 SKNode 子类上使用。毕竟,SKNode 是 NSObject 的子类。+node只是一种方便的方法。

+ (instancetype)node {
    CustomNode *body = [[self alloc] init];
    return body;
}

这没有什么问题。

于 2013-12-31T19:29:48.457 回答
1
+ (instancetype)node {
    CustomNode *body = [CustomNode node]; // infinite loop
}

无限循环是预期的结果,因为您正在调用相同的方法。至于另一个:

+ (instancetype)node {
    CustomNode *body = [super node]; // instance of SKNode, not CustomNode
}

这里的目标是让您CustomNode按预期进行初始化。当你创建一个UIViewController例子时也是一样的:

if ( self == [super initWithNibName:nibName bundle:bundle])

您想要进行标准初始化。您之后所做的就是使您CustomNode成为自定义节点的原因。:)

+ (instancetype)node {
    CustomNode *body = [super node];
    // My own logic goes here

   return body;
}
于 2013-12-31T19:39:34.123 回答
0

解决方案实际上是什么都不做。的默认实现返回调用它+[SKNode node]的任何类或子类的实例。

不要+[SKNode node]在你的子类中覆盖。实例化您的类的实例,如下例所示:

// In MyScene.m
// MyNode is a SKNode subclass

- (void)createNewNode
{
    MyNode *node = [MyNode node]; // node is of type MyNode

    [self addChild:node];
}
于 2014-07-03T22:03:38.773 回答