iphone - 带有工厂方法的 Objective C 类继承

标签 iphone objective-c oop inheritance

我想继承一个有工厂方法的框架类。如何使工厂方法返回我继承的类类型的对象?我找到了 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

请注意,UIImageCGImage 是不可变的。这不应导致图像数据的深层复制。

关于iphone - 带有工厂方法的 Objective C 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144701/

相关文章:

iphone - Cocos2d GestureRecognizer 在完成关卡并重新启动后无法工作

iphone - 让 iPhone 应用程序支持多语言的最佳方式

objective-c - 确定哪个IOS正在设备上运行

C++:继承基类方法

oop - nextTick 在类中的用法

c++ - C++ 中的抽象类可以使用抽象函数吗?

iphone - 界面生成器红色水平线

android - 使用 Web App 的移动推送通知

objective-c - 分离 SQLite 数据库时出错 - 数据库已锁定

iphone - 绘图线的优化,CAShapeLayer 的可能替代品