0

我是 Java 新手,遇到了一些问题。我想让一个班级变成另一个班级。很难用抽象的方式解释,所以我举个例子。

public class WorldGuard extends WorldGuardPlugin {
    public WorldGuard(Plugin parent) {
        WorldGuardPlugin plugin = parent.getServer().getPluginManager().getPlugin("WorldGuard")
        // make plugin the actual class
    }
}

WorldGuard在这里应该像某种包装器一样。构造时,它会获得一个参数parent,根据该参数找到WorldGuardPlugin. 该类现在应该成为该实例。这在 JavaScript 中很简单,我只返回实例,但在 Java 中我不能这样做。

4

4 回答 4

2

我不太确定你想做什么。一个类不能“成为另一个类”。但也许您的问题只是您在应该使用普通函数时尝试使用构造函数。也许你想要做的是:

public class WorldGuard extends WorldGuardPlugin
{
  public static WorldGuard getFromPlugin(Plugin parent)
  {
    return (WorldGuard) parent.getServer().getPluginManager().getPlugin("WorldGuard");
  }
}

这将通过父对象获取对象并将其作为 WorldGuard 对象返回。

于 2012-10-08T20:23:19.317 回答
1

班级不能成为其他班级。

我认为您可以在以下可能性中进行选择。

  1. 创建类实例的用户工厂。工厂将根据您想要的任何逻辑选择具体类并创建“正确”类的实例。如果您希望工厂操作的所有类都可以实现特定的接口,那么调用者甚至不知道创建了哪个类的实例。
  2. 使用包装模式。在这种情况下,您的实际WordGuard类将包装其他类的实际实例并将所有调用委托给那里。
  3. 使用动态代理或字节码工程解决方案。但它要复杂得多,在大多数情况下并不是最好的解决方案。
于 2012-10-08T20:25:57.470 回答
1

您应该调用WorldGuardPlugin. 我的意思是WorldGuardPlugin应该有一个构造函数,可以创建类的给定实例的副本,例如:

WorldGuardPlugin pg = new WorldGuardPlugin(anInstance);

如果是这种情况,那么你很幸运。你可以简单地做:

public class WorldGuard extends WorldGuardPlugin {
    public WorldGuard(Plugin parent) {
        super( parent.getServer().getPluginManager().getPlugin("WorldGuard"));
    }
}

这将使“WorldGuard 在这里起到某种包装器的作用”。您仍然可以在WorldGuardPlugin实例上调用定义的方法,WorldGuard同时能够为其WorldGuard自身添加方法。

于 2012-10-08T20:27:06.050 回答
0

您不能更改在构造函数中构造的对象的类型。根据定义,构造函数构造该类(例如,A构造函数创建类型A)。

在您的示例中,WorldGuardextends ,WorldGuardPlugin这意味着它WorldGuard . WorldGuardPlugin也许有一种方法可以使用您想要的属性来初始化WorldGuardPluin类(使用构造函数中的调用)。super

于 2012-10-08T20:23:45.133 回答