gpt4 book ai didi

Java 多态性 : subclass with extra fields

转载 作者:行者123 更新时间:2023-11-30 09:09:20 24 4
gpt4 key购买 nike

我使用 Java 编程已有一段时间,但主要是小型命令行程序。现在我有一个稍微大一点的项目,我正在努力制定一个像样的设计。这是一个小型数据库查找/更新工具。我有三种不同类型的表,但表之间有几个共享列。例如:

表 1 (FieldName, FieldId, FieldValue, AppName, AppId, AppValue)
表 2 (FieldName, FieldId, FieldValue, UpdatedBy)
表 3(字段名、字段 ID、字段值、更新日期)

我想要这样的东西:

abstract class BaseTable {
FieldName
FieldId
FieldValue
}
class Table1 extends?implements? BaseTable {
FieldName
FieldId
FieldValue
AppName
AppId
AppValue
}
class Table2 extends?implements? BaseTable {
FieldName
FieldId
FieldValue
UpdatedBy
}
class Table3 extends?implements? BaseTable {
FieldName
FieldId
FieldValue
UpdatedDate
}

我将阅读参数以确定我需要哪种类型的表,但基本上我想做这样的事情:

BaseTable bt = null;
if (tableType = Table1)
bt = new Table1();
else if (tableType = Table2)
bt = new Table2();
else if (tableType = Table3)
bt = new Table3();

bt.doSpecificStuff();
HashMap<String,BaseTable> map = new HashMap<String,Table1>();
map.put(someString, bt);

这里有几个问题:

  1. 我无法使用此设计访问子类的额外字段。

  2. 我不想使用Table1 t1 = new Table1();,因为参数类型不同,我无法使用通用方法。

  3. 当我尝试创建 hashmap 来保存对象的实例时,我收到一个编译错误:

    类型不匹配:无法从 HashMap 转换为 HashMap

基本上,我的设计似乎存在几个问题,我想不出解决这些问题的方法。我不想创建三个不相关的类,因为我觉得它违背了 OOO 的目的,而且我的程序保证使用它。此外,这一定是一个简单而优雅的解决方案的常见问题,但我找不到太多明确处理在其子类中具有额外字段的对象。谁能为我的程序建议一个更好的设计,以某种方式允许我访问子类字段,同时能够使用基类对象类型进行实例化?

最佳答案

您应该将代码中的倒数第二行更改为:

HashMap<String,BaseTable> map = new HashMap<String,BaseTable>();

然后您可以将您的子类的任何实例放入映射中。从那里,如果您需要执行特定于类的操作,您可以使用 instanceof 运算符并转换您的对象:

if (bt instanceof Table1) {
Table1 tmp = (Table1) bt;
tmp.do_something();
}
else if (bt instanceof Table2) {
Table2 tmp = (Table2) bt;
tmp.do_something_else();
}

...

希望这对您有所帮助!

关于Java 多态性 : subclass with extra fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23095285/

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