扩展返回的实例

时间:2012-10-08 20:17:18

标签: java class inheritance instance

我是一个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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

班级不能成为其他班级。

我认为你可以选择以下几种可能性。

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

答案 2 :(得分: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本身添加方法。

答案 3 :(得分:0)

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

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