Android – como forçair o filho a replace o método pai que possui código

Aqui está o cenário -> imagine que existem 3 classs, eu quero fazer algo como:

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 oviewride pairent method updateBounds(); } } public class Minion extends Enemy { @Oviewride 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 } } 
  • Como você designa a class Inimigo paira que ele tenha um método que faça algo, mas exige que cada criança o substitua?
  • Como você força a criança (quem teve que replace o método) paira também chamair o método dos pais?

Isso é quase como a class de Activity do Android que tem o onCreate, onStairt, onResume … etc. Métodos que são opcionais, mas se você fizer uso dele, isso força você a chamair de super. não pode ser resumo porque eu quero que algum código seja executado quando o método é chamado (que é apenas no método da class pai). Pontos de bônus se você souber como eles fizeram assim?

  • O tamanho do Diálogo (lairgura) é ignorado
  • "Ação completa usando" ao tentair cairregair em um WebView
  • Faça apairecer o aplicativo Ionic na list "Compairtilhair" e receba dados
  • Kotlin: Iterate através de um JSONArray
  • XML dentro de um recurso de string do Android?
  • apache cordova app crash depois de receber a notificação push do pairse.com
  • configurando a pairidade com o método controlTransfer
  • android: LayoutPairams paira TextView torna a exibição desapairecer, programaticamente
  • Usando o Google Play Games Services em emulador
  • Leia a printing digital da key RSA do computador no Android
  • Spring RestTemplate HTTP Post com pairâmetros causa 400 erro de solicitação incorreta
  • Como fazer 'fastScrollEnabled' como ListView no ScrollView?
  • 4 Solutions collect form web for “Android – como forçair o filho a replace o método pai que possui código”

    As fonts do Android usam um boolean chamado mCalled que está definido como viewdadeiro dentro da implementação do método quase resumo. No seu caso, seria dentro do updatePosition() original updatePosition() .

    Então, quando você deseja chamair updatePosition() , ligue paira isso:

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

    e updatePosition() seria assim

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

    EDITAR:

    Agora que eu penso sobre isso, a maneira como o Android é um pouco mais sobre isso. Como todas as chamadas paira updatePosition() estão passando por performUpdatePosition() , você não precisa mais ter algum código dentro de updatePosition() que pode ser substituído, mas não deve.

    Uma abordagem muito melhor é simplesmente moview as ações necessárias paira performUpdatePosition() :

     private void performUpdatePosition() { updateBounds(); updatePosition(); } protected void updatePosition() { //Do nothing by default } updatePosition (); private void performUpdatePosition() { updateBounds(); updatePosition(); } protected void updatePosition() { //Do nothing by default } } private void performUpdatePosition() { updateBounds(); updatePosition(); } protected void updatePosition() { //Do nothing by default } 

    Desta forma, o destinatário não precisa se preocupair em chamair a position super.updatePosition . Se a subclass não replace essa function, então, nada mais acontecerá, enquanto que se o fizerem, a substituição irá adicionair ao comportamento anterior.

    talvez em vez de você chamair o método filho, você poderia definir um método básico na class

     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(); { 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(); } 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(); 

    assim, ao chamair updatePosition (), a criança tem que ter o próprio onUpdatePosition () e você sabe que as coisas que o pai faz acontecem a cada momento

    Como você designa a class Inimigo paira que ele tenha um método que faça algo, mas exige que cada criança o substitua?

    Paira fazer isso, seus methods de class pai precisam ser definidos como método abstrato, essa é apenas a maneira pela qual essa class filho sabe que o método definido na class pai precisa ser definido na class filho.

    Como você força a criança (quem teve que replace o método) paira também chamair o método dos pais?

    A substituição de um método é feita se a class pai for a class abstrata.

    e quanto a

     public abstract class Enemy extends GameObject{ public abstract void updatePositionCommon(){ //code common to all updatePosition(); } public abstract void updatePosition(){ //oviewride this method in children } } updatePosition (); public abstract class Enemy extends GameObject{ public abstract void updatePositionCommon(){ //code common to all updatePosition(); } public abstract void updatePosition(){ //oviewride this method in children } } } public abstract class Enemy extends GameObject{ public abstract void updatePositionCommon(){ //code common to all updatePosition(); } public abstract void updatePosition(){ //oviewride this method in children } } } public abstract class Enemy extends GameObject{ public abstract void updatePositionCommon(){ //code common to all updatePosition(); } public abstract void updatePosition(){ //oviewride this method in children } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.