代码之家  ›  专栏  ›  技术社区  ›  Nathan

Objective-C中的方法重载-不用于Init?

  •  0
  • Nathan  · 技术社区  · 14 年前

    我刚开始在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;
    }
    

    为什么会这样?这样命名方法是否会导致子类中的问题?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Chuck    14 年前

    与algol风格的语言(如c)不同,objective-c的语法是专门为识字方法名设计的。 init: 对方法参数一无所知。接线员在启动我要经过的东西吗?不,它在某种程度上使用了参数,所以我们使用一个描述性的名称,比如 initWithFormat: 指定参数为格式字符串。

    而且,Objective-C根本没有方法重载。时期。给定类的单个选择器只能有一个类型签名。根据参数类更改行为的唯一方法是让一个方法采用可以包含许多不同类的泛型类型(如 id NSObject* ,为其类询问参数,并根据该查询的结果执行不同的操作。

        2
  •  3
  •   jer    14 年前

    这不是同一种方法。在Objective-C中,一个名为 init 不同于一个名字 init: . 冒号是选择器名称的一部分。

    而且,init经常被重写,您只是使用了错误的方法。

        3
  •  1
  •   dreamlax    14 年前

    除了jer的答案,它也不允许您指定多种方法来初始化实例。例如,nsstring具有 initWithString: , initWithFormat: 等。