Перегрузка метода в Objective-C - не используется для init? - PullRequest
0 голосов
/ 18 августа 2010

Я только начал программировать в Objective-C, я понимаю, что он только частично поддерживает перегрузку методов из-за способа генерации имен методов (см. этот вопрос ).

Однако мой вопрос заключается в том, почему я никогда не видел его в каких-либо примерах. Код ниже, кажется, работает нормально, но в любом другом примере, который я видел, второй 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 ]

8 голосов
/ 18 августа 2010

В отличие от языков в стиле Algol, таких как C #, синтаксис Objective-C специально разработан для грамотных имен методов.init: ничего не говорит мне о параметре метода.Приемник инициирует то, что я передаю?Нет. Он каким-то образом использует аргумент, поэтому мы используем описательное имя, например initWithFormat:, чтобы указать, что аргумент является строкой формата.

Кроме того, Objective-C вообще не имеет перегрузки методов.Период.Один селектор для данного класса может иметь только одну сигнатуру типа.Единственный способ изменить поведение, основанное на классе аргумента, - это заставить метод взять универсальный тип, который может включать в себя множество различных классов (например, id или NSObject*), запросить аргумент для его класса и делать разные вещи в зависимости отрезультат этого запроса.

3 голосов
/ 18 августа 2010

Это не тот же метод.В target-C селектор с именем init отличается от селектора с именем init:.Двоеточие является частью имени селектора.

Кроме того, init переопределяется довольно часто, у вас просто неправильный метод.

1 голос
/ 18 августа 2010

Кроме ответа Джера, он также не позволяет вам указать несколько способов инициализации экземпляра.Например, NSString имеет initWithString:, initWithFormat: и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...