假设我有类A,它调用类B或类C中的静态方法。它将调用哪个类将取决于在类A的构造函数中传递的参数。类B和C中的方法需要被称为具有相同的方法签名。那么,有没有办法做类似的事情:
Object call;
if (type == 0)
call = ClassA;
else
call = ClassB;
call.someMethod ();
我知道可以使用接口完成,并且让B类和C类都实现接口,但是每次上面的调用都需要创建一个B或C的对象,这是非常耗费资源的。所以,我想知道是否有其他方法可以做到这一点。
编辑:对不起,如果这不清楚,但Object call
是一个类变量,方法调用B类,C需要在类中的其他方法中进行,而不仅仅是构造函数。
答案 0 :(得分:5)
不要使用静态方法。使用接口(或基类),创建两个类的单个实例并将它们存储在静态字段中。这样,您不必每次都实例化,只需从字段中获取现有实例。
答案 1 :(得分:4)
由于这些方法是静态的,我假设我们正在讨论你不能控制的类中的辅助方法(否则你可以将它们移动到同一个类中)。在任何情况下,您都可以使用以下适用于各种情况的方法:
使用包含指向相关方法的Action
的变量。例如:
Action action;
if (type == 0)
action = ClassA.SomeMethod;
else
action = ClassB.SomeOtherMethod;
action();
当然,如果要将参数传递给被调用的方法,也可以使用其他委托类型(例如Action
的通用版本)。
使用此方法的一个限制是,您可能要调用的所有方法都需要具有相同的签名(参数的数量和类型)以及相同的返回类型。但是你仍然可以通过构建适配器函数来解决这个问题,这很容易使用lambdas:
// Assume that ClassA.SomeMethod accepts an int parameter
// If you know the value that should be passed, you can adapt it like this:
if (type == 0)
action = () => { ClassA.SomeMethod(42); };
答案 2 :(得分:1)
为什么不在if()语句中调用方法?
if( type == 0 )
{
ClassA.someMethod();
}
else
{
ClassB.someMethod();
}
如果你需要对方法的返回值做一些事情,那么仍然可以通过在语句外声明返回对象并在条件块中为其赋值。
答案 3 :(得分:1)
嗯,使用if else设置变量来调用公共函数。正如你打算有if / else一样,为什么不这样做......
if (type == 0)
ClassA.SomeMethod();
else
ClassB.SomeMethod();
答案 4 :(得分:0)
在您的示例中,您没有创建任何对象。
调用是静态的,因此不需要创建对象。