【问题标题】:Method Overloading in Objective-C - not used for init?Objective-C中的方法重载-不用于init?
【发布时间】:2010-08-18 06:28:20
【问题描述】:

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

这是什么原因?以这种方式命名方法是否会导致子类出现问题?

【问题讨论】:

    标签: objective-c operator-overloading


    【解决方案1】:

    与 C# 等 Algol 风格的语言不同,Objective-C 的语法是专门为有文字的方法名称而设计的。 init: 没有告诉我有关方法参数的任何信息。接收器是否正在启动我正在传递的东西?不。它以某种方式使用参数,所以我们使用像 initWithFormat: 这样的描述性名称来指定参数是格式字符串。

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

    【讨论】:

    • +1 表示“Objective-C 根本没有方法重载。期间。”
    【解决方案2】:

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

    另外,init 经常被覆盖,只是你使用了错误的方法。

    【讨论】:

      【解决方案3】:

      除了 jer 的回答之外,它还不允许您指定多种方式来初始化实例。比如NSString有initWithString:initWithFormat:等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多