2011-03-21 81 views
1

我想创建一个自定义对象,它只是继承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 

回答

5

NSString是类集群的一部分。你不能只创建它的任意子类,并且当你这样做时,你不能为它们分配常量字符串(这是NXConstantString类型)。请参阅NSString文档中的Subclassing Notes。一般而言,您不想子类NSString。对于大多数问题有更好的解决方案。

+1

您当然可以创建NSString或任何其他类集群的任意子类。您只需重写该类核心中的方法。然而,对类集群进行子类化通常是非常罕见的,而且绝对不是**应该简单地作为学习练习来完成! – bbum 2011-03-21 19:39:25

+0

我在这里滥用了“任意”这个词。我的意思是“只要把'NSString'扔到你的定义上。” – 2011-03-21 19:40:21

0

您声明命名类型的指针strOverrideOverrideTester变量。但是对于这个变量,你正试图给一个NSString分配一个指针。您不能将超类分配给子类的变量。设想一个通用类TwoWheeled和派生类Motorbike。 A Motorbike可以像对待TwoWheeled一样对待,但不是其他方式,因为Motorbike具有正常的功能TwoWheeled可能不像电动机。

2
  1. 你到你的OverrideTester类型的变量分配的NSString一个实例。如果你想要一个你的类的实例,你需要实例化该类的一个实例;类型转换将从不改变一个实例的类。

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

    - (NSString *)description;

  3. 试图了解通过继承NSString(或任何其他类簇)的子类化和压倒一切的方法。如果你想玩分类和类似的东西 - 一个很好的想法,当新的语言,肯定 - 然后子类NSObject,可能多个级别,并在那里玩。


你的意思是子类NSObject的, 潜在的多层次?是不是 可能NSObject可能有 相冲突的方法相比其他 类群或只是没有他们 可用于重写?

如果你的目标是找出方法覆盖的工作方式(我认为是这样),那么你最好自己去做。

我可能误解了你的问题。

在任何情况下,子类化NSString几乎从未做过。有用的情况非常少。重写description除了专门用于调试目的的自定义类之外,其他都是有用的,是的。在生产代码中调用description不应该完成。

此外,为什么说明会在此代码中返回一个 NSString *?

如果预期NSString*返回值的内容是调用不返回任何内容的版本,会发生什么情况?

崩溃。

+0

你是指如何继承NSObject,可能有多个级别? NSObject可能与其他类集群相比有可能存在冲突的方法,或者没有可用于重写的方法吗? – eastydude5 2011-03-21 19:50:13

+0

此外,为什么说明会在此代码中返回一个NSString *? – eastydude5 2011-03-21 19:55:03

相关问题