2015-11-01 270 views
0

我在Java中有繼承問題。我會用軍例如: 我有一個階級基礎:其他繼承類中的繼承類

public class Soldier { 
    Squad squad; 

    public Soldier(Squad _squad) { 
     squad = _squad; 
    } 
    //and some methods, that use squad 
} 

,我有:

public class Archer extends Soldier { 
    public Archer(ArcherSquad _squad) { 
     super(_squad); 
    } 
    //some new methods, some override 
} 

和:

public class Warrior extends Soldier { 
    public Warrior(WarriorSquad _squad) { 
     super(_squad); 
    } 
    //some new methods, some override 
} 

和我的小隊樣子:

Squad; 
ArcherSquad extends Squad(some new methods); 
WarriorSquad extends Squad(some new methods); 

現在我想訪問來自ArcherArcherSquad中的方法。我如何更改代碼而不用處理任何事情?

+1

這很難說什麼問題,您正在運行之中。你可以說得更詳細點嗎?你能展示你試圖打電話但不能辦的方法嗎? – kuporific

+0

我發現的唯一的小故障是,你正在接受_squad作爲參數,並且將super(班)而不是超級(_squad)給超類構造函數。由於Archersquad是小隊的一個子類,你應該能夠訪問它的方法恕我直言。 –

+0

在ArcherSquad中,我有'arrowStrike()'metod,並且我沒有在Archer中訪問,因爲Java說這個Squad沒有這個方法。這是正常的,但我想重構我的結構能夠做到這一點。 – Merdigon

回答

1

您可以移動參照陣容多達ArcherSquad

public abstract class Soldier { 
    // force subclass supply some squad 
    protected abstract Squad getSquad(); 
    public void someMethod() { 
     Squad squad = getSquad(); 
     // do something with it. 
    } 
} 

public class Archer extends Soldier { 
    private ArcherSquad archerSquad; 
    public Archer(ArcherSquad _squad) { 
     archerSquad = _squad; 
    } 
    @Override 
    protected Squad getSquad() { 
     return archerSquad; 
    } 
    ... 
} 

,或者你可以把Soldier成一個通用類

public class Soldier<T extends Squad> { 
    protected T squad; 

    public Soldier(T _squad) { 
     this.squad = _squad; 
    } 

    public void someMethod() { 
     Squad squad = this.squad; 
     // do something with it. 
    } 
} 

public class Archer extends Soldier<ArcherSquad> { 

    public Archer(ArcherSquad _squad) { 
     super(_squad); 
    } 

    public void someMethodUsingArcherSquad() { 
     ArcherSquad as = squad; 
    } 
    // some new methods, some override 
}