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、 のインスタンスを見つけるベースの 1 つのパラメーターを取得します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)。

あなたの例でWorldGuardは extendsです。WorldGuardPluginつまり、それWorldGuard のタイプですWorldGuardPlugin。おそらく、必要なプロパティでクラスを初期化する方法があります(コンストラクターでのWorldGuardPluin呼び出しを使用)。super

于 2012-10-08T20:23:45.133 に答える