为什么我会得到“不兼容的指针类型”?
我想创建一个自定义对象,它只是继承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
NSString
是类集群的一部分。你不能只创建它的任意子类,并且当你这样做时,你不能为它们分配常量字符串(这是NXConstantString
类型)。请参阅NSString文档中的Subclassing Notes。一般而言,您不想子类NSString
。对于大多数问题有更好的解决方案。
您声明命名类型的指针strOverride
到OverrideTester
变量。但是对于这个变量,你正试图给一个NSString
分配一个指针。您不能将超类分配给子类的变量。设想一个通用类TwoWheeled
和派生类Motorbike
。 A Motorbike
可以像对待TwoWheeled
一样对待,但不是其他方式,因为Motorbike
具有正常的功能TwoWheeled
可能不像电动机。
你到你的
OverrideTester
类型的变量分配的NSString
一个实例。如果你想要一个你的类的实例,你需要实例化该类的一个实例;类型转换将从不改变一个实例的类。-
description
被定义为返回一个NSString*
:- (NSString *)description;
做不试图了解通过继承
NSString
(或任何其他类簇)的子类化和压倒一切的方法。如果你想玩分类和类似的东西 - 一个很好的想法,当新的语言,肯定 - 然后子类NSObject,可能多个级别,并在那里玩。
你的意思是子类NSObject的, 潜在的多层次?是不是 可能NSObject可能有 相冲突的方法相比其他 类群或只是没有他们 可用于重写?
如果你的目标是找出方法覆盖的工作方式(我认为是这样),那么你最好自己去做。
我可能误解了你的问题。
在任何情况下,子类化NSString几乎从未做过。有用的情况非常少。重写description
除了专门用于调试目的的自定义类之外,其他都是有用的,是的。在生产代码中调用description
不应该完成。
此外,为什么说明会在此代码中返回一个 NSString *?
如果预期NSString*
返回值的内容是调用不返回任何内容的版本,会发生什么情况?
崩溃。
你是指如何继承NSObject,可能有多个级别? NSObject可能与其他类集群相比有可能存在冲突的方法,或者没有可用于重写的方法吗? – eastydude5 2011-03-21 19:50:13
此外,为什么说明会在此代码中返回一个NSString *? – eastydude5 2011-03-21 19:55:03
您当然可以创建NSString或任何其他类集群的任意子类。您只需重写该类核心中的方法。然而,对类集群进行子类化通常是非常罕见的,而且绝对不是**应该简单地作为学习练习来完成! – bbum 2011-03-21 19:39:25
我在这里滥用了“任意”这个词。我的意思是“只要把'NSString'扔到你的定义上。” – 2011-03-21 19:40:21