“Storing"调用静态方法的类

本文关键字:静态方法 调用 Storing quot | 更新日期: 2023-09-27 18:16:23

假设我有一个类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需要在类的其他方法中进行,而不仅仅是构造函数。

“Storing"调用静态方法的类

不要使用静态方法。使用接口(或基类),创建两个类的单个实例,并将它们存储在静态字段中。这样,您就不必每次都进行实例化,只需从字段中获取一个现有的实例即可。

由于方法是静态的,我假设我们正在讨论的是您无法控制的类中的helper方法(否则您可以将它们移动到同一个类中)。在任何情况下,您都可以使用以下在各种情况下都有效的方法:

使用包含指向相关方法的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); };

为什么不在if()语句中调用方法呢?

if( type == 0 )
{
    ClassA.someMethod();
}
else
{
    ClassB.someMethod();
}

如果需要处理方法的返回值,仍然可以在语句外声明返回对象并在条件块内为其赋值。

嗯,使用if else来设置一个变量来调用一个常用函数。既然你打算使用if/else,为什么不这样做呢?

if (type == 0)
    ClassA.SomeMethod();
else
    ClassB.SomeMethod();

在示例中,您没有创建任何对象。

调用是静态的,所以不需要创建对象