1

NSStringクラスを継承し、「description」メソッドをオーバーライドするカスタムオブジェクトを作成しようとしています。

ただし、コンパイルすると、次の警告が表示されます。

タイプ「NSString*」の式で「OverrideTester*」を初期化する互換性のないポインター型

これが私のコードです:

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
4

3 に答える 3

5

NSStringクラスクラスターの一部です。その任意のサブクラスを作成することはできません。作成する場合、それらに定数文字列(タイプ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本番コードの呼び出しは絶対に行わないでください。

また、descriptionがこのコードでNSString *を返すのはなぜですか?

戻り値を期待する何かが、NSString*何も返さないバージョンを呼び出すとしたらどうなるでしょうか。

クラッシュ。

于 2011-03-21T19:38:16.567 に答える
0

strOverrideにポインタ型の名前の変数を宣言していますOverrideTester。しかし、その変数に、ポインタをに割り当てようとしていますNSString。サブクラスの変数にスーパークラスを割り当てることはできません。ジェネリッククラスTwoWheeledと派生クラスを想像してみてくださいMotorbike。Aは、のMotorbikeように扱うことができますが、通常のモーターのようTwoWheeledには機能しない可能性があるため、その逆はできません。MotorbikeTwoWheeled

于 2011-03-21T19:32:44.220 に答える