Objective-C类方法返回父类对象

时间:2013-10-22 10:13:23

标签: objective-c subclass uibezierpath subclassing

我正在尝试向UIBezierPath添加属性。所以我创建了一个名为JWBezierPath的子类。我想让所有的类方法缩写也使用数字参数,所以我创建了方法:

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

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

bezierPath定义为:

+ (UIBezierPath *)bezierPath

所以你可能想要使用:

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

代替。

答案 1 :(得分:1)

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

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

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

VS

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

但是考虑到+bezierPath声明(+(UIBezierPath *)bezierPath)和你的证据,UIBezierPath类没有以这种方式实现,你必须在你的cub类中实现+bezierPath方法