【发布时间】:2011-08-31 15:34:59
【问题描述】:
我创建了一个类Metrics,它被设计为子类以自定义行为。为了使其更加健壮,Metrics 的 init 方法调用了一个名为 setup 的方法,该方法默认不执行任何操作。如果子类想要在初始化期间自定义行为(他们通常会这样做),他们可以重写此方法。由于默认实现什么都不做,因此无需记住调用[super setup]。
到目前为止,我喜欢它的工作方式,它强大且易于使用。我现在遇到的问题是有时设置方法需要设置一些额外的属性。一个例子:
@implimentation Metrics
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Do all the required initialization
}
}
@end
@interface SubclassOfMetrics : Metrics {}
@property (assign) CGFloat width;
@end
@implimentation SubclassOfMetrics
- (void)setup {
// This method is indirectly called as a result of the superclass initialization
// The code here depends on the `width` property being set
}
@end
我遇到的问题是 setup 在属性 width 可以设置之前被调用。我在这里有什么选择?我可以通过不在 init 方法中初始化我的 Metrics 类来解决这个问题。在我设置了我需要设置的属性之后,我可以明确地做到这一点。我不喜欢这个,因为它要求我按特定顺序执行操作并记住设置。我还有其他选择吗?
编辑:问题的根源实际上是Metrics 类的初始化做了很多计算。这些计算的结果将取决于子类中设置的属性,因此我需要一种方法来设置这些属性在超类完成初始化之前。
【问题讨论】:
-
+1... 有趣的问题。我确定这是有原因的,但是在这种情况下设置的目的是什么?子类不能在自己的init方法而不是setup方法中实现它们的初始化行为吗?
-
覆盖初始化器是可能的,但由于类的实例化方式而更加困难。进行初始化的类不知道
SubclassOfMetrics,因此它不知道调用特殊的init 方法。这是类集群。 -
另外,拥有
setup方法使子类化变得非常容易,而且这个类被设计为子类化,所以我想让它尽可能简单和健壮。 -
另外,setup 方法不是直接从 init 方法调用的(就像在我的示例中一样),它是在代码通过几个其他类之后在堆栈中向下调用大约 5 帧除了
Metrics。 -
@kubi 如果实例化 SubclassOfMetrics 的类对此一无所知,为什么该子类的新属性很重要。听起来您的设置将分配默认值。您可能想看看如何为您的“类集群”实现class cluster。
标签: objective-c initialization