2011-10-29 9 views
0

私はiPhone用のアプリケーションを作成し始めたJavaプログラマーです。私は問題でつまずいた。 (Javaで)次のコードをSupose:Objective-Cでのメソッドのオーバーライド

クラス1(建物)

public abstract class Building 
{ 
    public void Update() 
    { 
     specialAction(); 
    } 

    public abstract void specialAction(); 
} 

クラス2(ハウス)

public abstract class House extends Building 
{ 
    public abstract void specialAction() 
    { 
     System.out.println("Special Action Done"); 
    } 
} 

のRunnableクラス

public class Program 
{ 
    public void main(String[] args) 
    { 
     House h = new House(); 
     h.Update(); 
    } 
} 

House hUpdateメソッドが呼び出された場合、specialActionからHouseというメソッドが呼び出され、コンソールは「特別なアクション完了」を表示します。

クラス1(建物): .hファイル:

-(void)Update; 
-(void)SpecialAction; 

私の質問は、Xcodeで、次のコードは、(むしろそのコンソール出力をオーバーライド継承と方法の面で)と同等になり、あります.Mファイル:

-(void)Update 
{ 
    [self specialAction]; 
} 

クラス2(ハウス、拡張またはBuildingから継承): .mファイルを:

-(void)SpecialAction 
{ 
    NSLog("Special Action Done"); 
} 

のRunnableクラス

House* h = [[House alloc] init]; 
[h Update]; 
+0

試したときに何が起こったのですか? – vikingosegundo

答えて

3

あなたの例は正しいようです。お使いのJavaの例の完全なプログラムは、そのようにObjCで近似されます。

/* Building.h */ 
@interface Building : NSObject 
- (void)Update; 
- (void)specialAction; 
@end 

/* Building.m */ 
@implementation Building 

- (void)Update 
{ 
    [self specialAction]; 
} 

- (void)specialAction 
{ 
    assert(0 && "override required"); // << see note 
} 

@end 

/* House.h */ 
@interface House : Building 
@end 

/* House.m */ 
@implementation House 

- (void)specialAction 
{ 
    NSLog(@"Special Action Done"); 
} 

@end 

void ProgramMain() 
{ 
    House * h = [House new]; 
    [h Update]; 
    [h release]; 
} 

フォーマル抽象メソッド言語に組み込まれていませんが、プロトコルを使用して、それを近似することができます。

すべてのObjCメソッドを仮想と見なすことができます。

+0

抽象クラスでメソッドを作成する "標準的な"方法は、 'doesNotRecognizeSelector'メッセージを送信することです。' [self doesNotRecognizeSelector:_cmd]; ' – sebnow

+1

@sebnow「標準」とは考えていません。それは本当に単なるイラストレーションでした。実装には複数の形式があります。 – justin

2

BuildingからHouse継承していますか?

@interface House : Building 

この場合、特殊なアクションを別の名前で実装する必要はありません。 あなたはHouse.h

-(void)Update; 

を宣言し、

-(void)Update 
{ 
    NSLog("Special Action Done"); 
} 

Houseオブジェクト上Update方法は下院での定義を呼び出す呼び出すようHouse.mでそれを定義することができます。 m

PSあなたはiOSを初めて使っているので、 "House"のようなクラス名は大文字で始まります。メソッド名と変数名は小文字で始まります。

+0

javaとObjective-Cの両方の例で説明できないのは申し訳ありません。クラスHouseBuildingになります。 – rdelfin

関連する問題