10

シナリオは次のとおりです-> 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
    }
}
  • Enemy クラスをどのように設計して、何かを行うメソッドを持つようにしますが、すべての子がそれをオーバーライドする必要がありますか?
  • 子 (メソッドをオーバーライドしなければならなかった) に親のメソッドも呼び出すように強制するにはどうすればよいですか?

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

4

4 に答える 4

6

Android ソースmCalledは、準抽象メソッドの実装内で true に設定されたブール値の呼び出しを使用します。あなたの場合、それはオリジナルの中にありupdatePosition()ます。

次に、 を呼び出したい場合は、次updatePosition()のように呼び出します。

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

そして、updatePosition()このようになります

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

編集:

考えてみれば、アンドロイドのやり方は少し回りくどい。へのすべての呼び出しupdatePosition()が を通過するため、オーバーライドできるperformUpdatePosition()コードを内部に含める必要はなくなりましたが、そうすべきではありません。updatePosition()

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

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

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

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

于 2013-01-23T08:41:06.907 に答える
-1

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

これを行うには、親クラスのメソッドを抽象メソッドとして定義する必要があります。これは、親クラスで定義されたメソッドを子クラスで定義する必要があることを子クラスが知る唯一の方法です。

子 (メソッドをオーバーライドしなければならなかった) に親のメソッドも呼び出すように強制するにはどうすればよいですか?

親クラスが抽象クラスの場合、メソッドのオーバーライドが行われます。

于 2013-01-23T08:41:24.920 に答える
-3

どうですか

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

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

}
于 2013-01-23T08:38:54.660 に答える