1

私はxmlファイルを解析するように構成するクラスAを持っています。クラス B は A を拡張し、以前よりも多くのタグを持つ xml ファイルを解析するように構成します。

class A {
  protected String mFoo;

  protected loadFromXml (...){
     ...
     mFoo = ...
     ...
  }
}

class B extends A {
    protected String mBar;

    protected loadFromXml (...){
    super.loadFromXml(...);

    ...
    mBar = ...
    ...
    }
}

これで、クラス A を介して自分自身を構成する ActivityA ができました。

class ActivityA extends Activity {

protected A mAInstance;

    public void onCreate(Bundle savedInstanceState) {
        ...
        mAInstance.loadFromXml(...);
    ...
    other code...
        ...
    }
}

およびアクティビティ B:

class ActivityB extends ActivityA{

   protected B mBInstance;

   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    ...
    mBInstance.loadFromXml(...);
...
   }
}

問題は、ActivityB が mAInstance と mBInstance を保持しており、これらが同じデータ (mFoo) のサブセットを共有していることです。mBInstance のみをロードする方法は? もちろん、ActivityB の onCreate でスーパーを呼び出す必要があります...

4

3 に答える 3

1

まず、ActivityB が ActivityA を拡張していると仮定します。それ以外の場合、A は ActivityB からアクセスできません。

次に、A のタイプが既に使用可能であるため、B から mBInstance を削除できます。xml をロードするときは、loadFromXML への呼び出しを次のような新しいメソッドに移動します。

アクティビティ A:

protected onCreate(...) {
 ....
 loadXML();
}

protected void loadXML() {
  getNewInstance().loadFromXML();
}

protected A getNewInstance() {
  return new A();
}

次に、ActivityB では、getNewInstance() のみを次のようにオーバーライドする必要があります。

protected A getNewInstance() {
 return new B();
}

mBInstance.loadFromXml(...);ポリモーフィズムからも削除ActivityB#onCreate(...) して救助に!

于 2013-05-30T08:37:38.950 に答える
0

loadFromXml()gunar が示唆するように、ポリモーフィズムを使用して呼び出しを保護されたメソッドに移動します。Aただし、またはのインスタンスにB正しいタイプでアクセスする方法も解決する必要があります。次に例を示します。

クラスAB:

class A {
   public String mFoo;
   protected void loadFromXml() {}
}

class B extends A {
    public String mBar;

    @Override
    protected void loadFromXml() {}
 }

クラスActivityA

class ActivityA {
    private A mAInstance; // do not access this directly, use getter

    protected A getMInstance() { // getter
        return mAInstance;
    }

    @override
    public void onCreate() {
        initMInstance();
    }

    protected void initMInstance() {
        mAInstance = new A();
        mAInstance.loadFromXml();
    }

    private void f() {
        String s = getMInstance().mFoo; // access mAInstance like this
    }
}

クラスActivityB

class ActivityB extends ActivityA {
    private B mBInstance;

    @Override
    protected B getMInstance() { // override getter, ActivityA will see type A, activityB type B
        return mBInstance;
    }

    @Override
    public void onCreate() {
        initMInstance();
    }

    @Override
    protected void initMInstance() {
        mBInstance = new B();
        mBInstance.loadFromXml();
    }

    private void f() {
        String s1 = getMInstance().mFoo; // here you can access both properties
        String s2 = getMInstance().mBar;
    }
}
于 2013-05-30T08:59:33.523 に答える