目标C中的多态方法

ner*_*k99 3 overloading objective-c

在Java中,您可以将多个构造函数放入一个被调用的类中,这取决于构造实例时使用的参数的类型和/或数量.我假设在Objective C中有等价物.

我可以使用多态方法吗?

我想构建一个方法,根据字符串是传递还是双精度,行为略有不同?

这听起来有点疯狂吗?还是容易?

Jon*_*pan 5

您正在考虑重载方法.由于在Objective-C中实现动态分派的方式,目前无法将两个不相关的类型作为参数传递给相同(或同名)的方法并使其理解.

在Objective-C中,有两种相关但不同的方法来处理多种输入.让我们使用你的字符串或双精度输入的例子.在Java中,您可能有:

 void applyWidget(String s);
 void applyWidget(double d);
Run Code Online (Sandbox Code Playgroud)

这很棒,但不是Objective-C.在Objective-C中,您将使用两个不同的方法名称:

- (void)applyWidgetWithName: (NSString *)name;
- (void)applyWidgetWithValue: (double)value;
Run Code Online (Sandbox Code Playgroud)

每个方法中的逻辑与Java版本中的逻辑相同,但是不同的名称允许编译器将它们视为不同的方法(即使在Java中也是如此).代码也变为自我记录:通过阅读它,您得到一个即使没有评论也会发生什么.或者,如果您只需要一个方法名称,则将参数类型更改为id并接受任何对象:

- (void)applyWidget: (id)widget;
Run Code Online (Sandbox Code Playgroud)

然后通过NSStringNSNumber包裹你的double.然后,在该方法的实现中,使用Objective-C的内省方法来确定如何继续:

if ([widget isKindOfClass: [NSString class]]) {
    ...
} else if ([widget isKindOfClass: [NSNumber class]]) {
    double d = [widget doubleValue];
    ...
}
Run Code Online (Sandbox Code Playgroud)

这种方法基本上告诉呼叫者"发送任何东西 - 我会妥善处理它".没有大量文档,很难确定这种方法的行为.