[英]Call methods of child class in java
如何在下面的场景中调用所有类的print *()意味着在main()方法中调用A的printA(),B的printB()和C的printC()。
class A
{
public void printA(){System.out.println("A.printA()");}
}
class B extends A
{
public void printB(){System.out.println("B.printB()");}
}
class C extends A
{
public void printC(){System.out.println("C.printC()");}
}
class DemoInheritence
{
public static void main(String[] str){
printIt(new A());
printIt(new B());
printIt(new C());
}
public static void printIt(A a) {
//Here I wants to call A's printA(), B's printB() and C's printC()
//So how can I do this
}
}
通常,你做这样的事情,它被称为覆盖:
class A
{
public void print(){System.out.println("A.printA()");}
}
class B extends A
{
public void print(){System.out.println("B.printB()");}
}
class C extends A
{
public void print(){System.out.println("C.printC()");}
}
class DemoInheritence
{
public static void main(String[] str){
printIt(new A());
printIt(new B());
printIt(new C());
}
public static void printIt(A a) {
a.print();
}
}
对于您的代码,您可以使用以下内容:
public static void printIt(A a) {
if(a instanceof B) {
((B)a).printB();
} else if(a instanceof C) {
((C)a).printC();
} else {
a.printA();
}
}
但这有点不对,你应该在A的子类中重写该方法,或者更好地创建一个所有类实现并在代码中使用该接口的接口。
您可以使用反射API,但是您可能会做出一些假设。 至少有两种可能性:
解决方案1.如果打印方法被称为“print [Class name]”,则按名称获取方法:
public static void printIt(Object o) {
Class objectClass = o.getClass();
try {
Method printMethod = objectClass.getMethod("print" + objectClass.getName());
printMethod.invoke(o);
} catch (NoSuchMethodException e) {
throw new IllegalStateException("Method print"+objectClass.getName()+"() doesn't exist", e);
} catch (InvocationTargetException e) {
throw new IllegalStateException("Problem calling method print"+objectClass.getName()+"()", e);
} catch (IllegalAccessException e) {
throw new IllegalStateException("Method print"+objectClass.getName()+"() is not accessible", e);
}
}
解决方案2.如果每个类总是声明一个方法,则采用传递对象类的getDeclaredMethod返回的第一个方法:
public static void printIt(Object o) {
Class objectClass = o.getClass();
try {
Method printMethod = objectClass.getDeclaredMethods()[0];
printMethod.invoke(o);
} catch (InvocationTargetException e) {
throw new IllegalStateException("Problem calling method print"+objectClass.getName()+"()", e);
} catch (IllegalAccessException e) {
throw new IllegalStateException("Method print"+objectClass.getName()+"() is not accessible", e);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.