【问题标题】:Objective-C class methods returning parent class objectsObjective-C 类方法返回父类对象
【发布时间】:2013-10-22 10:13:23
【问题描述】:

我正在尝试向UIBezierPath 添加一个属性。所以我创建了一个名为JWBezierPath 的子类。我希望所有类方法的简写也带有数字参数,所以我创建了方法:

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

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

我该如何解决这个问题?

【问题讨论】:

  • 你能给我看看你的.h文件吗
  • 你想给UIBezierPath添加什么样的属性?

标签: objective-c subclass uibezierpath subclassing


【解决方案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 类没有以这种方式实现,你必须在你的 cub 类中实现 +bezierPath 方法

【讨论】:

  • 查看我对 Arkadiusz Holkos 答案的评论
【解决方案2】:

bezierPath 定义为:

+ (UIBezierPath *)bezierPath

所以你可能想使用:

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

改为。

【讨论】:

  • 那我就得得到UIBezierPath的源代码了。因为我不知道像 bezierPathForRect: 这样的方法会发生什么。
  • @Julian:Apple 将类方法的返回类型声明为(UIBezierPath *),因为他们可能不希望任何人覆盖它们。不过,你应该可以用实例方法来模拟它们,比如:addCurveToPoint:controlPoint1:controlPoint2:等。你还没有说你要添加什么样的属性。也许有比从UIBezierPath 继承更好的方法。
  • 我想添加一个color 参数(如我的示例方法所示)。我还可以创建一个类别并使用运行时......
  • 为什么不能使用UIColor的实例方法setStrokesetFill
  • 这是我打算做的。但是我必须将颜色与通过应用程序传输实例的路径相关联。另一种方法是一个带有字典的数组,但这对我来说有点太不透明了。现在我用obc/runtime.创建了一个类别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2011-10-14
  • 2012-01-21
相关资源
最近更新 更多