[英]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建议的受保护方法。 不过,您还需要解决如何使用正确的类型访问A
或B
的实例。 这是一个例子:
A
和B
类:
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.