2011-07-21 32 views
1
01 class SubClass extends SuperClass {} 
02 class AppSuperClass { 
03  /** 
04   * @param superClass 
05   */ 
06  public void print(SuperClass superClass) { 
07   System.out.println("AppSuperClass:superclass is parameter"); 
08  
09  } 
10  /** 
11   * @param subClass 
12   */ 
13  public void print(SubClass subClass) { 
14   System.out.println("AppSuperClass:subclass is parameter"); 
15 
16  } 
17 } 
18 
19 class AppSubClass extends AppSuperClass { 
20  /** 
21  * @param superClass 
22  */ 
23  public void print(SuperClass superClass) { 
24   System.out.println("AppSubClass:superclass is parameter"); 
25 
26  } 
27  /** 
28  * @param subClass 
29  */ 
30  public void print(SubClass subClass) { 
31   System.out.println("AppSubClass:subclass is parameter"); 
32 
33  } 
34 } 
35 public class OverloadedTest { 
36  public static void main(String[] args) { 
37   AppSuperClass appSuperClass = new AppSuperClass(); 
38   AppSuperClass appSubClass = new AppSubClass(); 
39   SuperClass superClass = new SuperClass(); 
40   SuperClass subClassInstance = new SubClass(); 
41   /* 
42   * Making request to print AppSuperClass 
43   * 1. Passing SuperClass instance 
44   * 2. Passing SubClass instance (*make note of the type) <img src="http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif?m=1304052800g" alt=":)" class="wp-smiley"> 
45   */ 
46 
47   appSuperClass.print(superClass); 
48   appSuperClass.print(subClassInstance); 
49   /* 
50   * Above is repeated with AppSubClass instance 
51   */ 
52   appSubClass.print(superClass); 
53   appSubClass.print(subClassInstance); 
54  } 
55 
56 } 

當我運行此我得到爪哇 - 超載和壓倒一切的

 AppSuperClass:superclass is parameter 
     AppSuperClass:superclass is parameter 
     AppSubClass:superclass is parameter 
     AppSubClass:superclass is parameter 

我怎樣才能得到

  AppSuperClass:superclass is parameter 
      AppSuperClass:subclass is parameter 
      AppSubClass:superclass is parameter 
      AppSubClass:subclass is parameter 

爲O/P在不改變任何對象的類型?

+0

你的意思是不改變任何*變量*的類型嗎? –

回答

2

你的問題不是很清楚,但它聽起來像你基本上在執行時間重載,這在Java中根本不存在。重載在編譯時完全解決。一種選擇是這樣的:

public void print(SuperClass superClass) { 
    if (superClass instanceof SubClass) {] 
     print((SubClass) superClass); 
     return; 
    } 
    System.out.println("AppSuperClass:superclass is parameter"); 
} 

請注意,你需要做的倍率爲好,或者有一個模板方法,這樣做,和一個單獨的printImpl(SuperClass)方法,該方法可以在子類中重寫。

藉此來的邏輯極端,你可能有:然後

class AppSuperClass { 

    public final void print(SuperClass superClass) { 
     if (superClass is SubClass) { 
      printImpl((SubClass) superClass); 
     } else { 
      printImpl(superClass);    
     } 
    } 

    protected void printImpl(SuperClass superClass) { 
     ... 
    } 

    protected void printImpl(SubClass subClass) { 
     ... 
    } 
} 

AppSubClass只會覆蓋printImpl(一個或兩個過載)。

編輯:正如評論中指出的,另一種方法是使用Visitor pattern。這不是我非常喜歡的模式,但如果您可以修改SuperClass和​​以瞭解AppSuperClass(或其實現的接口),它可以爲您工作。

+0

我認爲,而不是instanceof你也可以使用訪客模式。 – user802421

+0

@ user802421:僅當您可以更改SuperClass和SubClass時。就我們介紹的耦合而言,我不喜歡訪問者模式。不是我喜歡instanceof。 –

0

您將參數傳遞爲SuperClass。要麼從開始使用真正的類型,要麼在調用方法時通過強制轉換。

SubClass subClassInstance = .... 

或者在方法中使用實例類型檢查。

0

問題是,編譯器只知道參數至少是SuperClass類型,並且不知道分配給變量的對象的實際類型。因此它總是使用採用SuperClass參數的方法。

您可以檢查方法中的參數類,但是您想使用它的重載,在這裏不起作用。