2

ここで尋ねられたものに対するフォローアップの質問があります:

Java抽象クラス(このキーワード)

次のコードを使用します。

public class SuperClass() {
    boolean isDoneLoading = false;
    ArrayList items;
   public SuperClass() {
        loadData();
        items = new ArrayList();
    }
 
    protected void loadData() {
        // loadData is a class that requests data from remote server, populates "items"
        // and then calls doneLoading when done;

    }
    protected void doneLoading() {
        isDoneLoading = true;
    }
}

public class ExtendedClass extends SuperClass {

   public ExtendedClass() {
        super();    
   }
    protected void doneLoading() {
        // how can I get THIS method to be called when the super's doneLoading is called?
    }
}

// some other class
new ExtendedClass();

doneLoading()スーパーのdoneLoadingクラスが呼び出されたときに 、「子」(ExtendedClass)クラスを取得するにはどうすればよいですか?

4

4 に答える 4

3

doneLoadingに続いて子バージョンのルーチンが必要でありながら、この機能をに保持する場合は、別の名前を付ける必要があります。例えば、

public abstract class SuperClass {
    public void doneLoading() {
       isDoneLoading();
    }
    abstract isDoneLoading();
}

もう1つのオプションは、を呼び出す責任を子に委任しますsuper.doneLoading()

于 2012-09-15T22:45:03.673 に答える
2

あなたが書く場合:

ExtendedClass ec = new ExtendedClass();

loadDataスーパークラスで呼び出されますが(にはそのようなメソッドはありませんExtendedClass)、doneLoadingで呼び出されExtendedClassます。したがって、スーパークラスdoneLoadingメソッドは、オーバーライドしているため呼び出されません。

ps:このコメント:

loadDataは、リモートサーバーにデータを要求するクラスです。

コンストラクターでやりすぎだと思います。

于 2012-09-15T22:35:48.017 に答える
1

あなたがしていることが良いデザインであるかどうかという質問を無視して、これを行うだけです:

class ExtendedClass {
    protected void doneLoading() {
        super.doneLoading();
        // what needs to be called after SuperClass.doneLoading();
    }
}

もう1つの方法は、オブザーバーパターンを使用することです。(または、Chain of Responsibilityかもしれません。)基本的に、スーパークラスによって発行された「doneloading」イベントの処理ステップレジスタリスナーを追加する子クラスがあります。

于 2012-09-15T22:45:49.897 に答える
0

SuperClassに存在するDoneloading関数がオーバーライドされました。オーバーライドされた関数を呼び出そうとしています。スーパークラスの関数を呼び出す場合、オーバーライドするのは意味がないようです。

于 2012-09-15T22:45:36.390 に答える