Objective c 在目标C中函数重载是可能的吗?

Objective c 在目标C中函数重载是可能的吗?,objective-c,overloading,Objective C,Overloading,在目标C中函数重载是可能的吗 > AddioMex:y:< /Cord>,但不必。技术上,Objul-C中不可能有方法重载。在实践中,通常情况下,在C++无法使用的情况下,通常可以达到相同的结果。在Objective-C中,方法名称在每个参数前面都包含一个冒号,冒号是方法名称的一部分,这意味着您的示例使用不同的方法名称。实际上,这变成了一种伪命名参数功能,您可以通过参数函数而不是参数类型获得一个伪方法重载。在大多数情况下,这实际上会更有用,但它不是严格意义上的方法重载,因为方法名称不同 例如:

在目标C中函数重载是可能的吗<嗯,大多数程序员都说不,
但这似乎是可能的,例如:

-(int)AddMethod:(int)X :(int)Y
{
    return X + Y;
}
-(int)AddMethod:(int)X
{
    return X;
}
调用第一个写入
[self AddMethod:3]

要调用最后一个,请编写
[self AddMethod:3:4]

不,它不是,主要是因为Objective-C不使用函数,而是使用方法

另一方面,方法重载是可能的。有点

如果愿意的话,请考虑一个具有方法的类采用
NSString*
const char*
形式的参数:

@interface SomeClass : NSObject {

}

- (void)doThingWithString:(NSString *)string;
- (void)doThingWithBytes:(const char *)bytes;

@end

而方法本身不会在给定输入的情况下选择合适的方法;人们仍然可以说,
doThing:
是重载的,至少在这个意义上,这两种方法使用不同的参数来实现相同的功能。

方法重载在Objective-C中是不可能的。但是,您的示例实际上会起作用,因为您使用不同的选择器创建了两个不同的方法:
-AddMethod:
AddMethod:
。每个交错参数都有一个冒号。在C++中也可以使用一些文本,例如代码> > AddioMex:y:< /Cord>,但不必。

技术上,Objul-C中不可能有方法重载。在实践中,通常情况下,在C++无法使用的情况下,通常可以达到相同的结果。在Objective-C中,方法名称在每个参数前面都包含一个冒号,冒号是方法名称的一部分,这意味着您的示例使用不同的方法名称。实际上,这变成了一种伪命名参数功能,您可以通过参数函数而不是参数类型获得一个伪方法重载。在大多数情况下,这实际上会更有用,但它不是严格意义上的方法重载,因为方法名称不同

例如:

-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 X2:(float)x2 Y2:(float)y2;  
-(void)makeSquareWithX1:(float)x1 Y1:(float)y1 width:(float)width height:(float)height;  

这将在Objto-C中工作,但是在C++中不能获得类似的功能,因为参数的数目和类型是相同的,只有参数函数是不同的。在一些情况下,C++模型可以实现更有用的功能。NSKeyedArchiver类演示了这一点:

-(void)encodeFloat:(float)realv forKey:(NSString *)key  
-(void)encodeInt32:(int32_t)intv forKey:(NSString *)key  

在这里,他们不得不让参数类型成为moethod名称的一部分,这很难看。如果我可以选择C++重载和Objy-C“重载”,我仍然会选择后者。

类别提供了另一种方法来模拟C风格的方法重载在目标C中。作为一个例子,考虑下面的接口声明:

@interface MyClass
{
}
@end

@interface MyClass ( MethodVersion1 )
- (void) doSomething : (int) val;
@end

@interface MyClass ( MethodVersion2 )
- (void) doSomething : (double) val;
@end

不同的参数类型由类别解析。

您可以从一个通用方法开始,该方法根据传入对象的类型进行路由

- (void)doSomething:(id)obj;
然后,您可以检查类型以查看它是NSData还是UIImage,并在内部将其路由到适当的方法

- (void)doSomethingWithData:(NSData *)data;
- (void)doSomethingWithImage:(UIImage *)image;
您还可以选择只支持预期的类型,并优雅地拒绝处理不受支持的类型或显式失败


查找NSReSt1、NSaStR2等,另一种方法。

注意,如果需要/想在ObjuleC与C++结合时重载函数,则是可能的。我之所以提到这一点,是因为在XCode中,您需要将.m文件更改为.mm文件,以便它以这种方式处理它,这让我有几分钟的时间感到困惑

示例标题:

void addMethod(NSInteger a);
void addMethod(NSInteger a, NSInteger b);
如果将其包含在.m文件中,则会收到警告:

“addMethod”的冲突类型


将.m文件更改为.mm可以解决这个问题。

您可以使用较新的编译器重载C函数-虽然语法有点笨拙(没有快速定义无法解决的问题),但它工作得很好


我已经读过很多次程序员说,在objective C中函数重载是不可能的。这不是重载,您的方法有不同的选择器(=名称)。一个是
AddMethod:
,另一个是
AddMethod::
答案长度必须至少为15个字符;所以我把我的东西充实了一点这个例子甚至不是一种重载,它们只是两种不同的方法,命名意味着某种语义关系。这只是在没有重载的情况下常用的替代方法。@Georg:这本质上就是重载在C++中的实现方式:重载方法在代码中具有相同的名称,但它们实际的、损坏的名称不同,并且在编译时选择适当的名称。同样的原则在这里也适用,唯一的区别是程序员选择了正确的“损坏”名称,而不是编译器。@Williham Totland:名称损坏只是一个实现细节。没有什么可以说C++编译器/链接器必须使用名字的修饰。除了名字是一个实现细节,过载是一个具有所有捆绑的好处的语言特征(例如C++在一个通用上下文中只使用一个函数名)。你不必标记第二个参数,但实际上……你必须这样做。没有理由故意让你的代码变得迟钝。@kubi:完全同意。这和“你不必在C变量名中使用字母,你只需使用下划线字符串”是一样的。。。我认为计数为方法重载(不同数量的参数或类型)编辑:好的,看起来只有类型对你们来说才算重载。。。在网上这么多的例子中,我发现即使是不同的签名也算是“过载”。。。