考虑以下情况。我希望实现methoddA()
class A
的不同行为,具体取决于来自class D
或class C
的来电地点。如何实现这一点,方法覆盖在这里不起作用。
class A
{
public methodA(){ //some code }
}
class B
{
A a = new A()
public methodB()
{
a.methodA();
}
}
class C
{
B b = new B();
public methodC()
{
b.methodB();
}
}
class D
{
B b = new B();
public methodD()
{
b.methodB();
}
}
答案 0 :(得分:0)
这里需要的是多态性。首先创建一个接口 -
public interface MyInterface
{
void methodA();
}
然后为两种不同的行为创建两种不同的实现 -
public class First implements MyInterface
{
public void methodA() {
// first behavior
}
}
public class Second implements MyInterface
{
public void methodA() {
// second behavior
}
}
现在按以下方式创建其他类 -
class B
{
public void methodB(MyInterface m)
{
m.methodA();
}
}
class C
{
B b = new B();
public void methodC()
{
// Pass the corresponding behavior implementation
// as argument here.
b.methodB(new First());
}
}
class D
{
B b = new B();
public void methodD()
{
// Pass the second behavior implementation.
b.methodB(new Second());
}
}
这将产生更易于维护的代码。
答案 1 :(得分:0)
您可以将类名称作为String传递给方法,并在方法检查中
if(className.equals("A") // or use isInstanceOf() if you are passing objects of A/B
//do something
if(className.equals("B")
// do something else.
为什么需要两种不同的实现? 这个简单的技巧对你有用......如果我错了,请纠正我。
答案 2 :(得分:0)
我在下面的代码中修改了A1类和B1类的方法签名以接受Object,同样在调用C类和D类的方法时,我们调用B1类的方法将其作为参考传递。在A1类中,我们可以检查instanceof对象并识别调用类。
class A1
{
public void methodA(Object c){ //some code }
if (D.class.isInstance(c)){
System.out.println("Called from Class D");
}else if (C.class.isInstance(c)){
System.out.println("Called from Class c");
}else{
System.out.println("Called from Some diff class");
}
}
}
class B1
{
A1 a = new A1();
public void methodB(Object c)
{
a.methodA(c);
}
}
class C
{
B1 b = new B1();
public void methodC()
{
b.methodB(this);
}
}
class D
{
B1 b = new B1();
public void methodD()
{
b.methodB(this);
}
}
public class Testnew{
public static void main(String args[]){
D d = new D();
d.methodD();
C c = new C();
c.methodC();
B1 b = new B1();
b.methodB(b);
}
}