2013-01-23 9 views
8

を持つ親メソッドをオーバーライドするために子供を強制するにはここでのシナリオです - >私は一種のような何かをしたい、3つのクラスがあると想像:アンドロイド - どのようにコード

public class GameObject { 
    public void updateBounds() { 
     // do something 
    } 
} 

public abstract class Enemy extends GameObject { 
    public abstract void updatePosition(){ //<-- this will not compile, 
            //but this is what i want to do, to force 
            //child to override parent method 
     updateBounds(); 
    } 

} 

public class Minion extends Enemy { 
    @Override 
    public void updatePosition() { 
     super.updatePosition(); // <-- how do i throw an exception if this line 
           // is not called within this method of the 
           // child? 
     // now do something extra that only Minion knows how to do 
    } 
} 
  • どのように設計します敵のクラスで何かをするメソッドを持つようにしますが、すべての子がそれをオーバーライドする必要がありますか?
  • 親のメソッドを呼び出すために、子を強制的に(メソッドをオーバーライドしなければならない)強制しますか?

これは、onCreate、onStart、onResume ...などを持つAndroidのActivityクラスとほぼ同じです。メソッドはオプションですが、それを使用すると、スーパーメソッドを呼び出す必要があります。メソッドが呼び出されたときに(親クラスのメソッドでのみ)いくつかのコードを実行したいので抽象化できません。彼らがどうやってこのようにしたか知っていればボーナスポイント?およそ

public abstract class Enemy extends GameObject{ 
    public abstract void updatePositionCommon(){ 
     //code common to all 

     updatePosition(); 
    } 
    public abstract void updatePosition(){ 
     //override this method in children 
    } 

} 
+2

upvoteあなたの努力のために。 – Raj

答えて

5

Androidのソースは、ブール値を使用する方法

+0

うーん...大丈夫。私はそこにはすでに私が気づいていないJavaでより焼き付けられたソリューションがあることを望んでいました。しかし、私はこのハックが今の間しなければならないと思う。ありがとう! upvoted(数日前)&受け入れた –

+0

私はこの問題を解決する別の(より良い)方法を与える質問を編集しました。 –

-3

は準抽象メソッドの実装の内部でtrueに設定されているmCalledと呼ばれます。あなたの場合は、元のupdatePosition()の内部になります。あなたがupdatePosition()を呼び出したいとき

次に、このを通してそれを呼び出す:

private void performUpdatePosition() { 
    mCalled = false; 
    updatePosition(); 
    if (!mCalled) throw new SuperNotCalledException(); 
} 

updatePosition()この

protected void updatePosition() { 
    mCalled = true; 
    updateBounds(); 
} 

EDITのようになります。今、私はそれについて考える

、アンドロイドのやり方はちょっと回ります。 updatePosition()へのすべての呼び出しはperformUpdatePosition()を経由しているため、無効にすることができるupdatePosition()のコードを使用する必要はありません。

Aより良いアプローチは、単にperformUpdatePosition()に必要なアクションを移動することです:

private void performUpdatePosition() { 
    updateBounds(); 
    updatePosition(); 
} 

protected void updatePosition() { 
    //Do nothing by default 
} 

この方法で呼び出し先がsuper.updatePositionを呼び出すことを心配する必要はありません。サブクラスがその関数をオーバーライドしない場合、余分なものは発生しませんが、そうであればオーバーライドは以前の動作に追加されます。

+6

抽象メソッドはボディを持つことができません。 –

-1

どのように 何かを行うメソッドがあるように敵のクラスを設計しますが、すべての子がそれをオーバーライドする必要がありますか?これはあなたの親クラスのメソッドを行うに

は抽象メソッドとして定義する必要が、それは子クラスは、子クラスで定義されるために必要な、親クラスで定義されている方法を知っていることを唯一の方法です。

あなたはどのようにして(このメソッドをオーバーライドしなければならなかったのですか)、親のメソッドを呼び出すようにしますか?

親クラスが抽象クラスである場合にメソッドをオーバーライドします。

+1

OPは 'updatePosition()'の間にいくつかの共通コードの実行を強制したいと考えていますが、共通コードにヒットしなければ例外を投げることでオーバーライドすることができます。 –

4

多分代わりに、あなたは子供メソッドを呼び出すと、あなたはupdatePosition()を呼び出すと、子供はそれが自分のonUpdatePosition(だ持っている必要があり、そのようにクラスで

public void updatePosition() 
{ 
    //do what you need to do before the child does it's stuff 
    onUpdatePosition(); 
    //do what you need to do after the child does it's stuff 
} 

protected abstract void onUpdatePosition(); 

を基本メソッドを定義することができます)と、あなたは親が行うことが毎回起こることを知っています

関連する問題