1

我正在尝试创建一个简单地继承 NSString 类并覆盖“描述”方法的自定义对象。

然而,当我编译时,我收到一个警告:

使用“NSString *”类型的表达式初始化“OverrideTester *”的不兼容指针类型

这是我的代码:

主文件

#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;
}

覆盖测试器.h

#import <Foundation/Foundation.h>

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

OverrideTester.m

#import "OverrideTester.h"

@implementation OverrideTester

-(void) description

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

@end
4

3 回答 3

5

NSString是类簇的一部分。您不能只创建它的任意子类,并且当您这样做时,您不能为它们分配常量字符串(它们是 type NXConstantString)。请参阅NSString 文档中的子类化注释。通常你不想子类化NSString. 大多数问题都有更好的解决方案。

于 2011-03-21T19:35:44.027 回答
2
  1. NSString您正在为您的类型变量分配一个实例OverrideTester。如果你想要你的类的一个实例,你需要实例化那个类的一个实例;类型转换永远不会改变实例的类。

  2. description被定义为返回一个NSString*

    - (NSString *)description;

  3. 不要试图通过子类NSString(或任何其他类集群)来了解子类化和覆盖方法。如果你想玩子类化之类的东西——当你刚接触这门语言时,这是一个非常好的主意——那么子类化 NSObject,可能是多个级别,然后在那里玩。


你是什​​么意思子类 NSObject,可能是多个级别?与其他类集群相比,NSObject 是否可能具有冲突的方法,或者只是无法覆盖它们?

如果您的目标是弄清楚方法覆盖是如何工作的(我认为是这样),那么您最好完全自己做。

我可能误读了你的问题。

在任何情况下,子类化 NSString 几乎都没有完成。在极少数情况下它是有用的。是的,覆盖description除专门用于调试目的的自定义类之外的任何内容都是有用的。description永远不应该调用生产代码。

另外,为什么描述会在这段代码中返回一个 NSString* ?

如果期望NSString*返回值的东西调用你的版本但不返回任何东西会发生什么?

崩溃。

于 2011-03-21T19:38:16.567 回答
0

您正在声明一个名为strOverride指针类型的变量OverrideTester。但是对于该变量,您正在尝试将指针分配给NSString. 您不能将超类分配给子类的变量。想象一个泛型类TwoWheeled和一个派生类Motorbike。AMotorbike可以被视为 a TwoWheeled,但不能反过来,因为它Motorbike具有正常TwoWheeled可能不像电动机那样的功能。

于 2011-03-21T19:32:44.220 回答