1

我正在尝试将属性添加到UIBezierPath. 所以我创建了一个名为JWBezierPath. 我想让所有类方法的简写也带有数字参数,所以我创建了这些方法:

+ (JWBezierPath *)bezierPathWithColor:(UIColor *)color {
    JWBezierPath *path = [self bezierPath];
    [path setColor:color];
    return path;
}

问题是,它[self bezierPath]确实返回了一个实例UIBezierPath而不是我的子类。我也尝试使用具体类:[JWBezierPath bezierPath]

我该如何解决这个问题?

4

2 回答 2

1

如果你没有+bezierPath在你的类中实现方法,那么将调用超类实现,这将创建 UIBezierPath 的实例,而不是 JWBezierPath。

理论上,基类中的工厂方法可以创建实例,即使这些方法不会被覆盖,例如考虑 BaseClass 中工厂方法的 2 个选项:

// Will create instance of child class even if method won't be overriden
+ (instancetype) someObject {
   return [self new];
}

对比

// Will always create instance of base class
+ (BaseClass*) someObject {
   return [BaseClass new];
} 

然而,考虑到+bezierPath声明(+(UIBezierPath *)bezierPath)和你的证据 UIBezierPath 类不是这样实现的,你必须+bezierPath在你的 cub 类中实现方法

于 2013-10-22T10:32:08.237 回答
1

bezierPath定义为:

+ (UIBezierPath *)bezierPath

所以你可能想使用:

JWBezierPath *path = [[self alloc] init];

反而。

于 2013-10-22T10:29:30.150 回答