2013-05-30 42 views
1

我有類A配置自己解析一個XML文件。 B類擴展A並配置自己解析一個xml文件,該文件具有更多標籤,然後是前一個。Java繼承和活動

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?我當然需要調用超中的onCreate在ActivityB ...

+0

原帖編輯,它缺少一個延伸... – DeliriumTremens

回答

-1

B.loadFromXml()你做

super.loadFromXml(...); 

你會不會影響mAinstance可言。由於它不是靜態的,我假設你正在更新其中的this屬性,而不是創建任何新的實例;即使它是A類中的代碼,您也將更新B實例。

+1

好的,有一個d的問題因爲mAInstance和mBInstance包含重複的mFoo(在現實生活中,更多的字段和數據)...我想避免這種情況,並且只加載ActivityB – DeliriumTremens

+0

中的mBInstance但是'mFoo'是'B的一部分'也是。屬性會沿着類延伸。 – SJuan76

1

首先,我假設ActivityB擴展了ActivityA,否則A不能從ActivityB訪問。

然後,您可以從B中刪除mBInstance,因爲您已經有一種類型的A已經可用。 當您加載XML,移動呼叫loadFromXML到一個新的方法,如:

在ActivityA:

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

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

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

然後在ActivityB你需要重寫onlye的getNewInstance()到:

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

刪除也mBInstance.loadFromXml(...);ActivityB#onCreate(...) 多態性來救援!

0

我會使用多態性與loadFromXml()呼叫轉移到一個受保護的方法,通過Gúnár酒店的建議。不過,您還需要解決如何使用正確的類型訪問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; 
    } 
}