我想从具有工厂方法的框架类继承。如何让工厂方法返回我继承的类类型的对象?
这是你应该要做的所有事情:
@interface MONImage : UIImage
@end
@implementation MONImage
@end
然后:
MONImage * image = [MONImage imageNamed:name];
例如,我如何编写一个 UIImage 的子类,它 imageNamed: 会返回我的子类类型的对象?
+[UIImage imageNamed:] 的实现从这种方法中写出了子类。因此,您需要自己实现此方法。
这是一个应该声明工厂方法的方式:
+ (instancetype)imageNamed:(NSString *)pName;
以及一个应该如何实现它:
+ (instancetype)imageNamed:(NSString *)pName
{
MONImage * image = [[self alloc] initWithThisDesignatedInitializer:pName];
^^^^ NOTE: self, not a concrete class
...set up image...
return image;
}
但他们没有那样做——+[UIImage imageNamed:] 写出子类并在你写MONImage * img = [MONImage imageNamed:pName]; 时返回UIImage。有时这样做是有充分理由的。有些方法应该具有“最终”语义。当您的方法可能返回多种类型时,这通常会出现,例如在类集群中。该语言没有表达“最终”方法——但至少应该记录这种方法。
所以来看看这个UIImage 案例:
@interface MONImage : UIImage
+ (instancetype)imageNamed:(NSString *)pName;
@end
@implementation MONImage
+ (instancetype)imageNamed:(NSString *)pName
{
UIImage * source = [UIImage imageNamed:pName];
CGImageRef cgImage = source.CGImage;
if (cgImage)
return [[self alloc] initWithCGImage:cgImage];
// try it another way
return nil;
}
@end
请注意,UIImages 和 CGImages 是不可变的。这不应导致图像数据的深层复制。