2015-11-01 228 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 
}