我已经用Java编程了一段时间,但主要只是小型命令行程序。现在,我有一个规模稍大的项目,并且我正在尝试设计一个不错的设计。
这是一个小的数据库查找/更新工具。
我有三种不同类型的表,但是表之间有几个共享列。
例如:
表1(FieldName,FieldId,FieldValue,AppName,AppId,AppValue)
表2(FieldName,FieldId,FieldValue,UpdatedBy)
表3(FieldName,FieldId,FieldValue,UpdatedDate)

我想要这样的东西:

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.当我尝试创建用于保存对象实例的哈希图时,出现编译错误,提示:

Type mismatch: cannot convert from HashMap<String,Table1> to HashMap<String,BaseTable>


因此,基本上,我的设计似乎有几个问题,我想不出一种解决这些问题的方法。我不想创建三个不相关的类,因为我觉得它违反了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();
}

...


希望这可以帮助!

10-04 14:12