假设我有对象X和对象B.X是随机类的对象,后者又创建B,并将其自身传递以存储为对象B中的变量。
现在对象B想要在对象X中运行一个方法,而不知道它是什么类。
是否可以在任何对象中调用方法,如果存在具有该名称的方法,则运行,如果不存在,则不会运行。我假设一些try / catch可以解决这个问题。
但是我要说我有这样的事情:
public class ObjectB {
public Object parentX;
public ObjectB(Object x) {
parentX = x;
}
public void anyMethod() {
x.runMyMethod();
}
}
在我使用过的另一个程序中,这可以通过接口实现,因此可以了解Java也是如此。但是,我似乎找不到设置它的方法。所以,如果是上面的情况,那么如何设置它,以便ObjectB可以在程序中的所有类上调用该方法,如果那是我想要的呢?
答案 0 :(得分:2)
现在对象B想要在对象X中运行一个方法,而不知道它是什么类。
根本没有意义。要调用方法,您需要知道其名称和预期参数。从这个意义上讲,B级需要一些知识。因此,您可以/可以做类似
的事情if (parentX instanceof ClassA) {
( (ClassA) parentX ) . someAMethod(bla, blub);
}
if (parentX instanceof InterfaceC) {
( (InterfaceC) parentX ) . someCMethod(bla, blub);
}
从这个意义上讲:你可以在这里使用界面;但课程也有效。关键是:你需要一些信息;否则你就会陷入困境。
唯一的另一种选择是研究reflection - 然后你不需要知道具体的类型;因为你可以检查 parentX
以找出可以在该对象上调用哪些方法。但反思是A)一种先进的概念,b)在使用中错综复杂。
答案 1 :(得分:1)
是的,这绝对是可能的。
定义界面MyIntf
,您的Class X
实现它。现在在B类中,您可以将Class X
(或任何实现MyIntf
的类)的对象分配给父类型MyIntf
,您可以使用该父类调用方法
interface MyIntf
{
void runMyMethod()
}
public class ObjectX implements MyIntf {
void runMyMethod()
{
}
}
public class ObjectB {
public MyIntf parentX;
public ObjectB(MyIntf x) {
parentX = x;
}
public void anyMethod() {
parentX.runMyMethod();
}
}
答案 2 :(得分:0)
如果您查看此documentation的结尾,它会告诉您有关投射的信息。转换允许程序假定对象属于某种类型并尝试调用其中的方法。
public void anyMethod() {
((MethodParentObject) this.x).runMyMethod();
}