1

基本クラスといくつかのサブクラスを作成したい。そして、サブクラスのどのオブジェクトが作成されたかを基本クラスに知らせたいと思います。次のように、サブクラスのコンストラクターから基本クラスのメソッドを呼び出そうとしました。

class Base{
    private ArrayList<Base> subClasses;
    void addSubClassess(Base b){
        subClasses.add(b);
    }
    void calculateSubClasses(){
        System.out.println(subClasses.size());
    }
}

class Sub extends Base{
    Sub(){
        super.addSubClassess(this);
    }

}

public class Test{
    public static void main(String[] args){
        Sub s = new Sub();
        Base b = new Base();
        b.calculateSubClasses();
}

ただし、上記のコードは NullPointerException をスローします。それは、'addSubClassess' メソッドの呼び出しが実際にはサブクラスの作成前に行われるためです。したがって、この方法は期待どおりに機能しません。

それで、私の問題に対処する方法はありますか?これは、私が正確に何を望んでいるのかを説明する例です?

Shape という基本クラスがあり、Circle、Square、Triangle などの多くのサブクラスがあります。クラス Shape には、サブクラスによって上書きされる形状を消去するためのメソッド名「erase」があります。クラス Shape には、作成されたすべての形状を消去するための別のプライベート メソッド名「eraseAll」があります。したがって、「eraseAll」を呼び出したい場合は、何が作成されたかを正確に把握し、それらを一度に削除する必要があります。

誰かが私を助けてくれることを願っています。どうもありがとう!

4

2 に答える 2

1

このサンプルは役に立ちますか? この匿名ブロックは、サブクラス化コンストラクターのいずれかに対して呼び出され、カウンターがマップに配置されます。

単一の基本インスタンスにこれが必要な場合は、単語staticを削除する必要があります。


public class Base{
  private static final Map<Class, Integer> counters = new HashMap();

  {
     synchronized(counters){
        Integer v = counters.get(getClass());
        v = v == null ? 0 : v;
        counters.put(getClass(), v + 1);  
     }
  }
}

于 2013-10-21T22:18:25.587 に答える