我正在尝试创建一个自定义对象,它只是继承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;
}
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
答案 0 :(得分:5)
NSString
是类集群的一部分。您不能只创建它的任意子类,当您这样做时,您不能为它们分配常量字符串(类型为NXConstantString
)。请参阅NSString文档中的Subclassing Notes。通常,您不希望子类NSString
。对于大多数问题,有更好的解决方案。
答案 1 :(得分:2)
您正在为NSString
类型的变量分配OverrideTester
的实例。如果您想要类的实例,则需要实例化该类的实例;类型转换永远不会更改实例的类。
description
定义为返回NSString*
:
- (NSString *)description;
不尝试通过继承NSString
(或任何其他类集群)来了解子类化和重写方法。如果你想使用子类化等 - 当一个新的语言时,一个非常好的主意 - 当然 - 然后继承NSObject,可能是多个级别,然后在那里玩。
你是如何将NSObject子类化的, 可能是多个级别?不是吗 NSObject可能有 冲突的方法与其他方法相比 类集群或只是没有它们 可以覆盖?
如果您的目标是弄清楚方法覆盖是如何工作的(我认为是这样),那么您最好完全自己完成。
我可能误读了你的问题。
无论如何,子类化NSString几乎从未完成。极少数情况下它很有用。除了专门用于调试目的的自定义类之外,覆盖description
是有用的,是的。不应该在生产代码中调用description
。
另外,为什么描述会返回 这段代码中的NSString *?
如果需要NSString*
返回值的内容是调用不返回任何内容的版本,会发生什么?
崩溃。
答案 2 :(得分:0)
您正在声明一个名为strOverride
的变量,其类型指针指向OverrideTester
。但是对于该变量,您尝试分配指向NSString
的指针。您不能将超类分配给子类的变量。想象一下通用类TwoWheeled
和派生类Motorbike
。 Motorbike
可以被视为TwoWheeled
,但不能相反,因为Motorbike
具有正常TwoWheeled
可能没有电机的功能。