12

我有一个名为“Entity”的基类,它有一个名为“construct”的静态方法,它返回一个实体实例。我有这个类的几个不同的子类(为了演示假设我们有“水果”和“蔬菜”作为子类)。我希望能够按照以下方式做一些事情:

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代表的对象。而是通过它。为此,Fruit.class使用了它们的语法。

于 2012-08-21T21:30:49.330 回答
1

您正在尝试使用过程代码实现面向对象的设计模式Strategy。不要这样做。

相反,创建一个名为 的接口EntityConstructor,它定义了方法construct()。制作FruitVegetable实现该接口。然后更改someFunction()以获取该接口的实例。

于 2012-08-21T21:36:34.873 回答
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 回答
0

静态方法本身不是继承的,因为如果您的代码具有 Entity.construct(...) 它不会动态地将其链接到子类。

完成您所要求的最佳方法是使用反射来调用 Fruit 类(或传递给 someFunction() 方法的任何类)上的构造方法。

于 2012-08-21T21:30:07.967 回答