gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:41:16 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com