В NSString есть статический метод с именем + stringWithString :.
Более того, это метод класса.
Это не переопределено / не переопределено в NSMutableString
В какао подкласс ненеобходимо переопределить метод.На самом деле, это будет просто производить много шума (IMO).Ему нужно только переопределить метод для предоставления его пользовательской реализации.
, поэтому мы не можем предполагать, что это вернет NSMutableString.
Мы должны предположить, что он вернет изменчивую строку.Подкласс может переопределять свои инициализаторы и вспомогательные конструкторы по мере необходимости для выполнения требуемых контрактов без публичного повторного выделения метода - ему нужно только определить метод, когда реализация базы недостаточна.
Какая частьцели C я пропускаю в своих знаниях, чтобы понять, почему это работает и возвращает NSMutableString?Тем более, что базовый класс NSString не знает, что нам нужна изменяемая строка взамен.
Он «знает», потому что вы написали [NSMutableString stringWithString:@"bah"]
вместо [NSString stringWithString:@"bah"]
.Как и методы экземпляра, методы класса имеют неявное значение self
, которое позволяет им передавать тип через методы класса.Поэтому методы класса могут быть переопределены / переопределены по мере необходимости.Методы класса также могут использовать self
для определения или сообщения своего типа (пример в ближайшее время).
Можно сказать, что внутренне вызывается [Class alloc], который генерирует объект типа NSMutableString, нодаже это чисто догадки, так как у нас нет исходного кода и stringWithString: он может делать все, что захочет, внутренне.
Это не должно быть догадкой.В этом случае вам следует сообщить об ошибке, если вам была возвращена строка immutable .В противном случае он работает так, как объявлено, независимо от того, использовали ли они одно или несколько определений.
Все эти методы класса переопределены в подклассе?
В случае удобных конструкторов чаще всего используется один из назначенных инициализаторов:
такая реализация может иметь вид:
@implementation NSString
+ (id)stringWithString:(NSString *)arg
{
// self is either +NSString or +NSMutableString
return [[[self alloc] initWithString:arg] autorelease];
}
хотя часто можно делать исключения, и часто это происходит с оптимизированными неизменяемыми / изменяемыми типами:
@implementation NSString
+ (id)stringWithString:(NSString *)arg
{
return [arg imp_isMutable] ? [[[self alloc] initWithString:arg] autorelease] : arg;
}
...
@implementation NSMutableString
+ (id)stringWithString:(NSString *)arg
{
return [[[self alloc] initWithString:arg] autorelease];
}
...
И если да, то почему это не задокументировано?
Они не должны быть повторно объявлены или повторно задокументированы, если единственное отличие - это запрашиваемый вами тип класса, если только у них нет некоторого отклонения от базового класса или специального примечания - даже в этом случае было бы лучше создать метод с другимимя.