Почему я получаю несовместимый тип указателя?

Я пытаюсь создать собственный объект, который просто наследует класс NSString и переопределяет метод «описание».

Однако при компиляции я получаю предупреждение:

Несовместимые типы указателей, инициализирующие «OverrideTester *» с выражением типа «NSString *»

Вот мой код:

main.m

#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <Foundation/NSAutoreleasePool.h>
#import "OverrideTester.h"

int main (int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *str = @"Programming is fun";
    OverrideTester *strOverride = @"Overriding is fun";

    NSLog (@"%@", str);
    NSLog (@"%@", strOverride);

    [pool drain];
    return 0;
}

OverrideTester.h

#import <Foundation/Foundation.h>

@interface OverrideTester : NSString
-(void) description;
@end

OverrideTester.m

#import "OverrideTester.h"

@implementation OverrideTester

-(void) description

{
    NSLog(@"DESCRIPTION!\n");
}

@end

person eastydude5    schedule 21.03.2011    source источник


Ответы (3)


NSString является частью кластера классов. Вы не можете просто создавать произвольные подклассы, и когда вы это делаете, вы не можете назначать им постоянные строки (которые имеют тип NXConstantString). См. Примечания о подклассах в документации NSString. Как правило, вы не хотите создавать подкласс NSString. Для большинства проблем есть лучшие решения.

person Rob Napier    schedule 21.03.2011
comment
Вы, конечно, можете создавать произвольные подклассы NSString или любого другого кластера классов. Вам просто нужно переопределить методы в ядре класса. Однако создание подкласса кластера классов, как правило, происходит очень редко и уж точно не это то, что следует делать просто в качестве учебного упражнения! - person bbum; 21.03.2011
comment
Я неправильно употребил здесь слово произвольный. Я имел в виду просто добавить :NSString к вашему определению. - person Rob Napier; 21.03.2011

Вы объявляете переменную с именем strOverride типа указателя на OverrideTester. Но этой переменной вы пытаетесь присвоить указатель на NSString. Вы не можете назначить суперкласс переменной подкласса. Представьте себе универсальный класс TwoWheeled и производный класс Motorbike. С Motorbike можно обращаться как с TwoWheeled, но не наоборот, поскольку Motorbike имеет функции, которых у обычного TwoWheeled может не быть, например, двигатель.

person DarkDust    schedule 21.03.2011

person    schedule
comment
Как вы имеете в виду подкласс NSObject, потенциально несколько уровней? Возможно ли, что NSObject может иметь конфликтующие методы по сравнению с другими кластерами классов или просто не может их переопределить? - person eastydude5; 21.03.2011
comment
Кроме того, почему в этом коде описание возвращает NSString*? - person eastydude5; 21.03.2011