2013-01-24 42 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 
    } 
}