多个子类,如何实例中的任何一个?

这将有点难以解释,但我会尽我所能。

我希望有多个项目,当点击时,每个项目都有不同的结果。 其余的,它们都有相同的变量。 所以基本上,我有一个类Item,子类Ball,Rope,Book,还有很多,还有更多。 如果我愿意,我希望能够轻松添加项目。 Item类具有String名称,String描述和每个子类重写的方法’onUse’。

我想尽可能地处理这个动态,这意味着我想在我的Frame / Activity(这适用于Android但Java适用)中使用单个方法来执行该方法。

我用它来做一个方法:

public void useItem(Item i) { i.onUse(); } 

我的问题是我在数据库中保存了不同的项目。 我想随机抓取数据库中的一个项目并实例化它; 除了我无法知道将其实例化为哪个子类。 我尝试在数据库中保存数据类型,但这并没有真正解决… Pseudocode:

 //Database cursor stuff //... String itemType = c.getString(6); //Get the class name if possible Class itemClass= null; try { itemClass = Class.forName(itemType); } catch (ClassNotFoundException) e.printStackTrace(); } Item l = null; // Check here what type it is! if (itemClass.equals(Ball.class)) { l = new Ball(name,description); } else if(lootClass.equals(Book.class)){ l = new Book(name,description); } 

看到有这么多不同的项目,这不是很好,因为我必须遍历大量的类(加上我经常得到ClassNotFoundException)

你怎么说,StackOverflow? 什么是最好的方法?

工厂模式可能是要走的路。 如果将完全限定名称存储在数据库中,则可以创建一个读取值的工厂,并使用以下内容实例化新项:

 Item item = (Item) Class.forName(theDBField).newInstance(); item.setName(name); item.setDescription(desc); 

这意味着一个更简洁的工厂,不必了解它可以构建的所有类。 我真的不喜欢每次添加新实现时都要更新工厂,这是一种避免它的简单方法。

为此,您必须将getter和setter添加到项目界面。

在您的情况下,我将使用Factory方法模式 (又名工厂模式)。

工厂方法模式是一种创造模式。 创建模式通过隐藏对象的创建方式并使系统独立于对象创建过程来抽象对象实例化过程。

让我们尝试实现它应该如何工作:

模型

 public abstract class Model { protected abstract void init(); } 

 public class Book extends Model { @Override protected void init() { System.out.println("I'm a Book"); } } 

 public class Ball extends Model { @Override protected void init() { System.out.println("I'm a Ball"); } } 

DbModelFactory

 public abstract class DbModelFactory { public abstract Model getModel(int modelId); } 

SimpleDbModelFactory

 public class SimpleDbModelFactory extends DbModelFactory { @Override public Model getModel(int modelId) { Model model = null; if(modelId == Const.MODEL_BOOK) { model = new Book(); } else if(modelId == Const.MODEL_BALL) { model = new Ball(); } else {// throw Exception } return model; } } 

常量

 public class Const { public static final int MODEL_BOOK = 0; public static final int MODEL_BALL = 1; } 

发射台

 public class Launcher { public static void main(String[] args) { DbModelFactory factory = new SimpleDbModelFactory(); Model book = factory.getModel(0); book.init(); // I'm a Book Model ball = factory.getModel(1); ball.init(); //I'm a Ball } } 

工厂模式返回多个产品子类中的一个。 您应该使用工厂模式如果您有超类和许多子类并且基于提供的某些数据,您必须返回其中一个子类的对象

现在我们有2个Models bookball ,我们并不关心两者实际上是Model