2012-05-08 43 views
2

代碼:如何從java中的desendant類使用方法使用字段?

ClassA extends ClassBase { 

protected IntefaceA parA; 
.... } 

InterfaceA extends InterfaceBase 

ClassBase { 

protected IntefaceBase parB; 

public method1() { 

    parB.someMethod(); 
} 

代碼:

ClassA testClass=new ClassA(); 
testClass.setParA(new InterfaceA {....};); 
testClass.method1(); 

我接收零指示字例外,因爲方法metho1使用來自ClassBase所使用由方法1類變量是parB。有沒有可能有method1使用parA? 如果不是,我需要複製&將method1的所有代碼從基類粘貼到後代。

謝謝。

+0

PARA被parB的類型,因爲擴展了InterfaceA InterfaceBase。所以使用來自後代類的變量應該沒有問題... – user810430

+0

它是ClassA的對象。所以邏輯將會使用類ClassA – user810430

回答

1

覆蓋字段在Java中是不可能的,只能覆蓋方法。所以你可以做的是將你的parA/parB成員隱藏在一個protected virtual獲得者後面,並且只能通過getter方法訪問它們。然後覆蓋吸氣劑ClassA返回parA而不是parB

ClassBase { 
    private IntefaceBase parB; 

    protected IntefaceBase getPar() { 
    return parB; 
    } 

    public method1() { 
    getPar().someMethod(); 
    } 
} 

ClassA extends ClassBase { 
    private IntefaceA parA; 

    protected IntefaceBase getPar() { 
    return parA; 
    } 
} 
+1

請注意,在Java中,可以縮小子類的返回值。即如果需要它的方法,可以聲明'ClassA.getPar'返回'InterfaceA'而不是'InterfaceBase'。 – user1252434

+1

@ user1252434,的確,如果'ClassA'中使用'IntefaceA'的方法,這可能會很有用。由於這裏沒有明確要求,所以最好保持示例代碼簡單並且一次教授一個想法:-) –

+0

好點。 OTOH爲什麼還會需要場區域? :)無論如何,我的評論意味着作爲一個額外的提示,而不是對你的答案的批評。 – user1252434

2

您不能覆蓋Java中的字段,即不能說,parA覆蓋parB的方式,子類的方法將覆蓋基類的方法。

你需要做的是提供用於parB變量的訪問方法getPar,你ClassA覆蓋返回parA其中。

然後在method1,當你需要訪問parA你只需要通過這種方法。由於Java中的所有方法都是virtual,因此即使從ClassBase內調用子類'getPar「方法也會被調用。

interface InterfaceBase { 
    void someMethod(); 
} 

interface InterfaceA extends InterfaceBase { 
    ... 
} 

class ClassA extends ClassBase { 

    protected InterfaceA parA; 

    @Override 
    protected InterfaceA getPar() { 
     return parA; 
    } 
} 

class ClassBase { 
    protected InterfaceBase parB; 

    public void method1() { 
     InterfaceBase parObj = getPar().someMethod(); 

     // Big method... no need for code duplication. 
    } 

    protected InterfaceBase getPar() { 
     return parB; 
    } 
} 
+0

的變量所以需要複製和粘貼所有大的方法? – user810430

+0

或需要更改設計? – user810430

+0

@ user810430,如果'method1'使用'par'對象作爲'InterfaceBase',那麼就不需要代碼重複。正如我在我的例子中解釋的那樣,只要通過'getPar'方法。 – aioobe

相關問題