Почему я получаю «несовместимый тип указателя»? - PullRequest
1 голос
/ 21 марта 2011

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

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

Несовместимые типы указателей, инициализирующие «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;
}

1017 * 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

Ответы [ 3 ]

5 голосов
/ 21 марта 2011

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

2 голосов
/ 21 марта 2011
  1. вы присваиваете экземпляр NSString вашей переменной типа OverrideTester. Если вам нужен экземпляр вашего класса, вам нужно создать экземпляр этого класса; приведение типов никогда не изменит класс экземпляра.

  2. description определяется как возвращающий NSString*:

    - (NSString *)description;

  3. Не не попытаться узнать о методах создания подклассов и переопределения путем создания подклассов NSString (или любого другого кластера классов). Если вы хотите поиграть с подклассами и тому подобным - очень хорошая идея, если вы новичок в языке, конечно же, - тогда подкласс NSObject, потенциально несколько уровней, и играйте там.

<Ч />

Как вы имеете в виду подкласс NSObject, потенциально несколько уровней? Не так ли возможный NSObject может иметь конфликтующие методы по сравнению с другими кластеры классов или просто не имеют их доступно для переопределения?

Если ваша цель состоит в том, чтобы выяснить, как метод переопределяет работу (что я и думал), то вам лучше сделать это полностью самостоятельно.

Возможно, я неправильно прочитал ваш вопрос.

В любом случае, создание подклассов NSString практически никогда не выполняется. Есть очень мало случаев, когда это полезно. Да, полезно переопределить description в любом другом месте, кроме пользовательских классов, специально для целей отладки Вызывать description в рабочем коде никогда не следует.

Кроме того, почему описание должно возвращать NSString * в этом коде?

Что бы произошло, если бы что-то, ожидающее возвращаемого значения NSString*, вызвало бы вашу версию, которая ничего не возвращает?

Авария.

0 голосов
/ 21 марта 2011

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

...