gpt4 book ai didi

java - 多个子类,如何实例化其中的任何一个?

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:52 26 4
gpt4 key购买 nike

这会有点难以解释,但我会尽力而为。

我想要多个项目,单击这些项目时,每个项目都有不同的结果。对于其余部分,它们都具有相同的变量。所以基本上,我有一个 Item 类,还有 Ball、Rope、Book 的子类,还有很多很多。如果我愿意,我希望能够轻松添加项目。 Item 类有一个字符串名称、字符串描述和一个每个子类都覆盖的方法“onUse”。

我希望尽可能动态地处理这个问题,这意味着我希望在我的框架/Activity (这是针对 Android 但 Java 适用)中有一个方法来执行该方法。

我将其用于单一方法:

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

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

//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?什么是最好的方法?

最佳答案

在您的情况下,我会使用工厂方法模式(也称为工厂模式)。

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

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

型号

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
}
}

工厂模式返回几个产品子类之一。你应该使用工厂模式如果您有一个父类(super class)和多个子类,并且根据提供的一些数据,您必须返回其中一个子类的对象

现在我们有 2 个 Models bookball 我们不关心它们实际上是 Model .

关于java - 多个子类,如何实例化其中的任何一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19369723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com