2012-05-03 11 views
0

私はobjective-cを学び、何らかの問題を起こそうとしています。私はクラスCreatureを作成し、それをDogクラスで拡張しました。クラスをobjective-cで拡張する

しかし、メソッドの状態を呼び出すとき、戻り値はDogではなく、クリーチャークラスから呼び出されたように見えます。 githubのsource

P.S.ため

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

コード:

@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]); 
+2

リンクを確認したい人はいません。だから、[SSCCE](http://sscce.org/)を投稿してみてください。 – Jomoos

+0

ソースは非常に小さいです) – Kein

+1

'+ CreatureBorn'メソッドが何をしているかを見せてください。おそらく初期化子は 'self'を初期化していないでしょうが、' Creature'クラスは初期化しています。 –

答えて

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を読むことを強くおすすめします。