12

Entityインスタンスを返す「construct」という静的メソッドを持つ「Entity」という基本クラスがあります。このクラスにはいくつかの異なるサブクラスがあります (デモンストレーションのために、サブクラスとして「果物」と「野菜」があると仮定します)。私は次の行に沿って何かをできるようにしたいと思います:

Entity a = someFunction(Fruit, textfile)

someFunction は textfile を Fruit.construct に渡し、生成されたエンティティを返します。これを行う簡単な方法はありますか?

4

7 に答える 7

10

代わりにファクトリ パターンを使用してください。
テキスト ファイルをファクトリ メソッドに渡します。ファクトリ メソッドはそれを使用して、適切な具象インスタンスを返します。Entity

于 2012-08-21T21:30:01.023 に答える
7

次のような意味です。

public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
 return clazz.newInstance();
}

上記のコードは、クラスの引数なしのコンストラクターを使用します (あると仮定します)。

クラスを特定のコンストラクターでインスタンス化する必要がある場合は、次の例に従ってください。

public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
  // Here I am assuming the the clazz Class has a constructor that takes a String as argument.
  Constructor<T> constructor = clazz.getConstructor(new Class[]{String.class});
  T obj = constructor.newInstance(textFile);
  return obj;
}
于 2012-08-21T21:34:44.363 に答える
3

関数に渡しFruit.class、そのクラス オブジェクトでリフレクションを使用して、適切なコンストラクターを呼び出します。これにより、コンストラクターの存在が要求されるため、スーパークラスがそのサブクラスに非常に緊密に結合されることに注意してください。

于 2012-08-21T21:28:58.710 に答える
2

Fruitあなたの例ではタイプでありFruit.eat()、静的メソッドを参照している可能性がありますがFruit、「静的クラス」ではありません。

実際にはクラスObject表す「クラス オブジェクト」があります。代わりに渡します。それに到達するために、they 構文Fruit.classが使用されます。

于 2012-08-21T21:30:49.330 に答える
1

これが実装です:

public <T extends Entity> T someMethod(Class<T> entityClass, File file) throws InstantiationException, IllegalAccessException {
        T newEntity = entityClass.newInstance();
        // do something with file
        // ...
        return newEntity;
    }

あなたはに目を向けるべきです

于 2012-08-21T21:45:52.453 に答える
1

手続き型コードを使用して、オブジェクト指向の設計パターンStrategyを実装しようとしています。やらないでください。

代わりに、EntityConstructorメソッドを定義する というインターフェイスを作成しますconstruct()。そのインターフェースを作成FruitしてVegetable実装します。次にsomeFunction()、そのインターフェイスのインスタンスを取得するように変更します。

于 2012-08-21T21:36:34.873 に答える
0

コードに Entity.construct(...) がある場合、それをサブクラスに動的にリンクしないという点で、静的メソッド自体は継承されません。

あなたが求めていることを達成するための最良の方法は、リフレクションを使用して Fruit クラス (または someFunction() メソッドに渡されたクラス) のコンストラクト メソッドを呼び出すことです。

于 2012-08-21T21:30:07.967 に答える