2014-04-12 206 views
0

我有一個「工具」類和「Axe」或「Hammer」等各種子類。每種工具(Ax,Hammer)至少有一個在子類中定義的方法。還有一個「工人」職業,當時只有一種工具可以用作工具。超類的子類的調用方法

工具類:

public abstract class Tool { 

    private double durability; 

    public double getDurability() { 
     return durability; 
    } 

    public void setDurability(double durability) { 
     this.durability = durability; 
    } 
} 

斧類:

public class Axe extends Tool { 

    public void chop() { 
     //chop some wood 
    } 
} 

我們爲工人設置一個工具:

Tool tool = new Axe(); 

的問題是,當我叫「斧頭。 「我得到getDurability()和setDurability()但不是chop()。

+1

代碼中沒有'axe'變量。 – divanov

回答

0

你必須鑄造斧

((Axe)tool).chop(); 

後致電但是你必須鑄造,以避免任何異常

if (tool instanceof Axe) { 
    ((Axe)tool).chop(); 
} 
+1

這很有效,因爲我必須檢查正確的工具。所以贏得勝利,謝謝:) – GoingWild

1

如果你想打電話chop前檢查它,你需要知道你有一個Axe(不只是任何舊的Tool)。 然後你可以強制轉換:

Axe axe = (Axe) tool; 
axe.chop(); 

如果你不知道這是一個真正的Axe,您可以先檢查(但是這是一個有點設計的氣味):

if (tool instanceof Axe){ 
    Axe axe = (Axe) tool; 
    axe.chop(); 
} 
4
abstract class Tool { 

    private double durability; 

    public double getDurability() { 
     return durability; 
    } 

    public void setDurability(double durability) { 
     this.durability = durability; 
    } 

    public void work(){ 

    } 
} 




class Axe extends Tool { 

     @Override 
     public void work() { 
      this.chop(); 
     } 

     public void chop() { 
      //chop some wood 
     } 
    } 
+0

+1。但是也許在這裏做個「扒」。在'Tool'中做'工作'摘要。 – Thilo

+0

@Thilo - 是的,根據「work()」上的'Tool'的意圖是否正確(可能存在一些默認行爲)。 'chop()'可以是私有的,取決於是否有專門的'Axe'子類。 – Bhaskar