0

私はobjective-cを学び、いくつかの問題を解決しようとしています。クラス Creature を作成し、それを Dog クラスで拡張しました。

しかし、メソッドの状態を呼び出すと、返される結果は、Dog ではなくクリーチャー クラスから呼び出されたように見えます。

githubソースへのリンク

ps 他のバグやメモリ リーク ポイントを見つけた場合は、私に報告してください)

コード:

@interface Creature: NSObject
    - (NSString *)state;
..

@implementation Creature
- (NSString *)state
{
    return [_name stringByAppendingString: ([self isHungry] ? @" is hungry" : @" not hungry")];
}

// Dog 

@interface Dog: Creature
..

@implementation Dog
- (NSString *)state
{
    return [[super state] stringByAppendingString: ([self isFriendly] ? @" and friendly" : @" and unfriendly")];
}

そして呼び出し方法

Dog *creature = [Dog CreatureBorn];
NSLog([creature state]);
4

1 に答える 1

3

Dog.h しかなく、実装ファイル (Dog.m) がないようです。Objective-C は動的言語であるため、すべてのクラスは実行時に作成されます (objc_allocateClassPair() 関数、IIRC を使用)。ヘッダー ファイルがあるだけでは、クラスを前方宣言するだけで、実際には作成されません。

また、Dog クラスは Creature から継承していません。PetProtocol プロトコルで確認しているだけです。Objective-C のプロトコルは、Java や C# のインターフェイスに似ており、クラスではありません。

内部的には、Objective-C ランタイムは非常に単純です。要約すると、一連の C 関数と構造体になります。Objective-C の仕組みを学ぶことに興味があり、C コードを読んでもかまわない場合は、Apple のObjective-C Runtime Referenceを読むことを強くお勧めします。

于 2012-05-03T06:42:03.463 に答える