gpt4 book ai didi

objective-c - objective-c 中的抽象工厂模式

转载 作者:太空狗 更新时间:2023-10-30 03:58:55 26 4
gpt4 key购买 nike

我只是想学习 objectives-c。

我看过关于 AbstractFactory 的维基百科示例跨不同语言的模式。

这是按钮定义:

@protocol Button
- (void)paint;
@end

@interface WinButton : NSObject <Button>
@end

这是一个工厂:

@implementation WinFactory
- (id)createButton {
return [[[WinButton alloc] init] autorelease];
}
@end

据我所知,obj-c 的 id 关键字应该类似于 C# 的 var 或 C++11 的 auto,对吧?

所以我的问题是:

为什么让工厂返回一个没有指定类型的泛型对象?这是一个错误(让工厂返回不是 Button 的其他东西)还是有任何理由这样做?

我会这样写一个工厂:

@implementation WinFactory
- (id<Button>)createButton {
return [[[WinButton alloc] init] autorelease];
}
@end

我错了吗?

最佳答案

why let the factory return a generic object of a not specified type?

在许多情况下,您会看到 id返回,这是因为它们的类型不一致(真正的抽象对象),或者是因为会引入隐式向上转换。

Is this an error (that let factory return something other that is not a Button) or is there any reason to do that?

这不是错误。当然,您不应返回不匹配的类型。

I'd write a factory this way:… am I wrong?

@implementation WinFactory
- (id<Button>)createButton {
return [[[WinButton alloc] init] autorelease];
}
@end

这种情况下的一个大难题是 ObjC 的类型非常松散,您应该努力确保所有选择器的参数和返回类型匹配。也就是说,每createButton在你所有的翻译中都应该返回相同的类型并且具有相同的参数类型。有时您必须选择更具描述性的名称,以避免编译器产生歧义。

这应该可以解释为什么 +[NSString string]返回 id -- 如果它返回 NSString , 然后 +[NSMutableString string]可能是警告的来源。这是因为编译器可能很难(不可能)将方法声明与动态实例相匹配。这也可能有助于您理解选择器的“冗长”命名,例如在方法中也包含类型的便利构造函数(例如 +[NSDictionary dictionaryWithObject:] 而不是简单的 +[NSDictionary withObject:] )。

但要回答您的问题:id<Button>NSObject<Button>*或其他一些限定类型就可以了——只要您能接受该通用方法签名。您正在引入类型限定,这有助于编译器帮助

关于objective-c - objective-c 中的抽象工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12142627/

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