我想继承一个具有工厂方法的框架类。如何使工厂方法返回我继承的类类型的对象?
这就是你的全部should得做:
@interface MONImage : UIImage
@end
@implementation MONImage
@end
Then:
MONImage * image = [MONImage imageNamed:name];
例如,我如何编写 UIImage 的子类 imageNamed: 将返回我的子类类型的对象?
+[UIImage imageNamed:]
的实现将子类化器从这种方法中编写出来。因此,您需要自己实现此方法。
这是如何一should声明一个工厂方法:
+ (instancetype)imageNamed:(NSString *)pName;
以及如何一个should实施它:
+ (instancetype)imageNamed:(NSString *)pName
{
MONImage * image = [[self alloc] initWithThisDesignatedInitializer:pName];
^^^^ NOTE: self, not a concrete class
...set up image...
return image;
}
但他们并没有那样做——+[UIImage imageNamed:]
写出子类并返回UIImage
当你写的时候MONImage * img = [MONImage imageNamed:pName];
。有时这样做是有充分理由的。有些方法应该具有“最终”语义。当您的方法可能返回多种类型(如在类簇中)时,通常会出现这种情况。该语言不表达“最终”方法——但这样的方法至少应该被记录下来。
所以要解决这个问题UIImage
case:
@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
注意UIImage
s and CGImage
s 是不可变的。这不应导致图像数据的深层复制。