我刚开始使用Objective-C进行编程,据我所知,由于方法名称的生成方式,它只部分支持方法重载(参见this question)。
然而,我的问题是为什么我从未在任何例子中看到过它。下面的代码似乎工作正常,但我见过的任何一个例子,第二个init都会被命名为initWithServerName
或类似的东西,而不是利用重载。
-(id) init {
self = [super init];
return self;
}
// usually this would be called initWithName or something? but to me it
// seems easier this way because it reminds me of method overloading from C#.
-(id) init: (NSString*)newServerName {
self = [super init];
if(self) {
serverName = [[NSString alloc] initWithString:newServerName];
}
return self;
}
这是什么原因?它是否会导致子类中的问题以这种方式命名方法?
答案 0 :(得分:8)
与C#等Algol风格的语言不同,Objective-C的语法是专门为有文化的方法名称设计的。 init:
告诉我关于方法参数的任何信息。接收器是否正在启动我正在传递的东西?不。它以某种方式使用参数,因此我们使用像initWithFormat:
这样的描述性名称来指定参数是格式字符串。
此外,Objective-C根本没有方法重载。期。给定类的单个选择器只能有一个类型签名。基于参数类更改行为的唯一方法是让方法采用可包含许多不同类的泛型类型(如id
或NSObject*
),询问其类的参数并执行不同的操作取决于该查询的结果。
答案 1 :(得分:3)
这不是同一种方法。在objective-C中,名为init
的选择器与名为init:
的选择器不同。冒号是选择器名称的一部分。
此外,init经常被覆盖,你只是有错误的方法。
答案 2 :(得分:1)
除了jer的答案之外,它还不允许您指定多种初始化实例的方法。例如,NSString有initWithString:
,initWithFormat:
等