2017-07-11 84 views
0

我有一個擴展類,需要在父類中使用和擴展版本的變量。到目前爲止,我已經擺脫了使用這樣的:在Java的子類中使用父變量的擴展版

public class ParentClass 
{ 
    protected ParentVariable variable; 

    public ParentClass(){ 
     this.variable = new ParentVariable(); 
    } 
    .... 
} 

public class ChildClass extends ParentClass 
{ 
    public ChildClass(){ 
     super(); 
     this.variable = new ChildVariable(); 
     //Where ChildVariable Extends ParentVariable 
     .... 
    } 
} 

這或多或少的作品,只要我每次使用可變我將它轉換爲ChildVarible但這是醜陋和拋出了一些問題。有沒有更好的方法來執行此操作?謝謝。

+0

不清楚:如果超類中的所有方法都在子類中可見,那麼爲什麼還需要隨時拋出它。 –

+0

ChildClass中定義的變量在哪裏? –

+2

@EugeneS我認爲OP忘記提及'ChildClass'在他的代碼中擴展了'ParentClass'。 –

回答

2

如果可以讓你的超類的抽象,您可以通過使用泛型解決這個問題:

public abstract class ParentClass<T extends ParentVariable> 
{ 
    private T variable; 

    protected T getVariable(){ 
     return variable 
    } 

    protected void setVariable(T variable){ 
     this.variable = variable; 
    } 
    .... 
} 

public class ChildClass extends ParentClass<ChildVariable> 
{ 
    public ChildClass() { 
     setVariable(new ChildVariable()); 
     //Where ChildVariable Extends ParentVariable 
     ChildVariable foo = getVariable() // no cast nessecary 
    } 
} 

注意,我做了你的私人領域。您應該始終通過getter和setter方法訪問字段,即使在子類中也是如此。

如果這是不可能的(也許即使是這樣),這是一個指標,表明您的設計存在缺陷。重構所有的類可能需要實現一個乾淨的架構。不幸的是,這取決於所有四個類的整個實現,也可能取決於這些類使用的整個上下文。對於stackexchange而言,答案太寬泛。

+0

感謝您的回答,這是一個非常有趣的解決方案,但不幸的是我不能讓我的父類抽象。 –

+0

@SamuelJones看到我的編輯 –