繁体   English   中英

Java继承和活动

[英]Java inheritance and Activities

我有一个类A,该类可自行配置以解析xml文件。 类B扩展了A,并配置自身以解析具有比前一个标签更多标签的xml文件。

class A {
  protected String mFoo;

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

class B extends A {
    protected String mBar;

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

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

现在,我有了ActivityA,它通过A类进行自我配置:

class ActivityA extends Activity {

protected A mAInstance;

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

和ActivityB:

class ActivityB extends ActivityA{

   protected B mBInstance;

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

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

现在,问题是:ActivityB拥有mAInstance和mBInstance,它们共享同一数据(mFoo)的子集。 如何仅加载mBInstance? 我当然需要在ActivityB中的onCreate中调用超级...

首先,我假设ActivityB扩展了ActivityA,否则无法从ActivityB访问A。

然后,您可以从B中删除mBInstance,因为您已经具有A类型。 加载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(...)多态性解救!

我会使用多态性,并将loadFromXml()调用移至gunar建议的受保护方法。 不过,您还需要解决如何使用正确的类型访问AB的实例。 这是一个例子:

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;
    }
}

B.loadFromXml()时,

super.loadFromXml(...);

您完全不会影响该实例。 由于它不是静态的,因此我假设您正在其中更新this属性,而不创建任何新实例; 您将更新B实例,即使它是A类中的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM