【发布时间】:2013-12-20 10:47:25
【问题描述】:
我在 Objective-C 中有一个抽象接口,其中每个子类都需要设置一个属性,然后在 init 末尾对该属性执行完全相同的操作。我试图避免使用类似这样的重复代码:
接口文件
@interface Shape : NSObject
@property (nonatomic) PropertyType *prop;
- (id)init;
- (void)initProperty;
@end
实施文件
@implementation Shape
- (id)init
{
if(self = [super init]) {
[self initProperty];
[prop doSomething];
}
return self;
}
- (void)initProperty
{
}
@end
我的问题是每个子类都需要一组不同的参数传递给initProperty,以便正确实现该方法:
@implementation Rectangle
- (void)initPropertyWithRect:(CGRect)rect
{
prop = [RectangleStuff rectangleWithRect:rect];
}
@end
@implementation Circle
- (void)initPropertyWithRadius:(CGFloat)radius
{
prop = [CircleStuff circleWithRadius:radius];
}
@end
有没有一种干净的方法来做我在 Objective-C 中尝试做的事情?到目前为止,我的选择似乎是:
- 创建一个“财产包”,然后传递一个
NSDictionary。 - 在每个子类中复制
[property doSomething];代码。 - 不知何故将工厂对象传递给init,并让工厂对象创建
prop。这种方法似乎最干净,但我需要工厂对象以某种方式将矩形和/或半径保持为内部状态,这对我来说似乎并不干净。
有什么想法吗?
【问题讨论】:
-
顺便说一下,不要使用
init来作为这些方法名称。如您所见:clang.llvm.org/docs/… init 系列中的方法隐式使用它们的 self 参数并返回一个保留对象。 -
@GabrielePetronella 谢谢你的提醒......我一直在犯这个错误。
标签: ios objective-c initialization factory template-method-pattern