我想继承一个有工厂方法的框架类。如何使工厂方法返回我继承的类类型的对象?我找到了 this useful article它描述了类似的情况,但在他们的情况下,您可以控制父类(super class)。例如,我如何编写 UIImage
的子类,imageNamed:
会返回我的子类类型的对象?
最佳答案
I would like to inherit from a framework class that has a factory method. How can I make the factory method return an object of my inherited class type?
这就是您应该要做的所有事情:
@interface MONImage : UIImage
@end
@implementation MONImage
@end
然后:
MONImage * image = [MONImage imageNamed:name];
How could I write, say, a subclass of UIImage that imageNamed: would return an object of my subclass type?
+[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 = 时返回一个
.有时这样做是有充分理由的。某些方法应该具有“最终”语义。当您的方法可能返回多种类型时,这通常会出现,例如在类簇中。该语言不表达“最终”方法——但至少应该记录这种方法。UIImage
[MONImage imageNamed:pName];
所以回到这个 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
请注意,UIImage
和 CGImage
是不可变的。这不应导致图像数据的深层复制。
关于iphone - 带有工厂方法的 Objective C 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144701/