2013-11-23 36 views
0

這裏是我的問題: 我有一個Piece類,它有方法getName返回「P」(它只是一個例子) 我有另一個類King擴展Piece並且有重新定義了getName方法返回「K」。如何選擇使用基於變量類型的方法

現在我有一個Piece(Piece []數組)的數組(在這個數組中有實例King的對象) 當我從所有這些對象中調用getName時,我總是從所有對象中獲得「P」。 我想從King對象中獲得「k」,從Piece對象中獲得「P」。 下面是一個示例:

Piece[] p = new Piece[1]; 
p[0] = new King(); 
p[0].getName() //I got "P" not "K" 

如何解決我的問題?

謝謝。

+4

向我們展示代碼。我們會幫助你更容易。 –

回答

2

既然你沒有表現出任何的代碼,我會告訴你一個簡單的例子:

public class Piece { 

    public String getName() { 
     return "P"; 
    } 
} 

public class King extends Piece { 

    @Override 
    public String getName() { 
     return "K"; 
    } 
} 

public class JavaTest { 

    public static void showNames(Piece[] p) { 
     for (Piece x : p) { 
      System.out.println(x.getName()); 
     } 
    } 

    public static void main(String[] args) { 

     Piece[] p = new Piece[]{ 
      new Piece(), 
      new King() 
     }; 

     showNames(p); 
    } 
} 

輸出

P 
K 
+0

謝謝我忘了@Override。現在我知道我們爲什麼要使用它 –

+0

@rabahRachid你從來沒有聲明過你是否將'Piece'變量存儲在'Piece []'或者'King'中。我假設後者,因此我的答案是基於此。看到我的新答案。 =) –

+0

這是另一個問題,我會提出另一個問題 –

-2

以前的答案被刪除

我已經糾正在我以前的答案錯誤拿出一個解決方案。我在名爲getSpecificName()的子類中添加了一個新方法,它接受一個參數int來決定調用哪個getName(),從而爲您提供適當的值。

的代碼可以在這裏找到:http://ideone.com/ioF06I

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class IdeoneBase{ 

    public String getName(){ 
     return "P"; 
    } 
} 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone extends IdeoneBase 
{ 
    @Override 
    public String getName(){ 
     return "K"; 
    } 

    String getSpecificName(int x){ 
     if(x == 1){ 
      return super.getName(); 
     } 
     return getName(); 
    } 

    public static void main (String[] args) throws java.lang.Exception 
    { 
     IdeoneBase piece = new Ideone(); 
     if(piece instanceof Ideone){ 
      Ideone p = (Ideone) piece; // without this downward cast, you cannot call getSpecificName(). You can only call that is common between the two. 
      System.out.println(p.getSpecificName(1)); 
      System.out.println(p.getSpecificName(999)); 
     } 
    } 
} 
+0

有沒有解決方法? –

+0

是的,將「Piece」下降到「King」,然後調用該方法。我知道我的例子是愚蠢的,但爲了方便起見,我使用了這個例子。使用像'piece [0] instanceof King {...}'這樣的檢查' –

+1

如果方法被覆蓋,那麼調用覆蓋類的方法,而不是父類的方法。我只是測試了這一點。 – Makoto

2

你可能想要做的是使Piece一個抽象類。因爲它是可能不會直接實例化一個基類,你將有其他類擴展它有哪些具體的類,即 - 國王,王后,典當,魯克,主教,騎士等

public abstract class Piece { 

    ... // other code 

    public abstract String getName(); 

    ... // other code 
} 

public class King extends Piece { 

    ... // other code 

    @Override 
    public String getName() { 
     return "K"; 
    } 

    ... // other code 
} 
2

你絕對肯定,King extends Piece

這就是所謂的is-a的關係。 A KingPiece,因此它從Piece繼承是有意義的。

public class Piece { 
    public String getValue() { 
     return "P"; 
    } 
} 

public class King extends Piece { 
    public String getValue() { 
     return "K"; 
    } 
} 

有了這個,當你實例化一個新KinggetValue()將返回"K",如您所願。