2013-01-24 80 views
0

我有一個主類,一個X類和一個Z類。覆蓋方法,無需更改任何原始代碼

X有方法a()。

Z有方法b()。

主要調用方法B()中的Z,然後方法()在十

然後,我有我的課X2與它的方法A2()。

是否可以在不改變Main或X的情況下強制Main通過Z的b()方法從X2中使用方法a2()而不是X中的方法?

+5

爲什麼不*顯示*我們的代碼而不是*描述*它? – NPE

+0

那麼爲什麼你不只是將Z.b()中的方法調用從()改爲a2()呢? – RoflcoptrException

+0

你的問題的答案是「否」我假設你說「改變」時,你指的是改變源代碼或改變類與像AspectJ或其他字節代碼工具工具一樣加載類。 –

回答

2

不,你不能這樣做,因爲Main類仍然創建一個X X x = new X()的實例。

讓Main類調用一個方法覆蓋X.a()的唯一方法是將Main中的調用更改爲X x = new X2()

0

如果我理解你的問題,那麼是的,如果Z負責創建X,X2擴展X.這稱爲多態。考慮這個例子:

public class X { 
    public void a() { 
     System.out.println("X.a"); 
    } 
} 

public class X2 extends X { 
    public void a() { 
     System.out.println("X2.a"); 
    } 
} 

public class Z { 
    private X my_x; 
    public Z() { 
     this.my_x = new X2(); 
    } 

    public X getX() { 
     return my_x; 
    } 

    public void b() { 
     System.out.println("Z.b"); 
    } 
} 

public class Main { 
    public static void main(String[] Args) { 
     Z z = new Z(); 
     X x = z.getX(); 
     z.b(); 
     x.a(); // this prints. X2.a 
    } 
}