简单的多态问题

zeko075 2016-05-17 05:24:37
今天突然碰到一个问题,感觉很简单但是搞了半天也没搞出来,大家帮忙看一下。
现在有两个地方有一块相似的代码块(不要太纠结程序对错,修改过的,原方法太长),如下:

public void function_1() {
.......
for(int i = 0; i < imagesIdList.size(); i++) {
String imageId = imagesIdList.get(i);
SysDocTO_1 docImg = super.getBaseDAO().queryForObject(SysDocTO_1.class, imageId);
if(null != docImg){
docImg.setSortIndex(i + 1);
super.getBaseDAO().update(docImg);
}
}
.......
}

public void function_2() {
.......
for(int i = 0; i < imagesIdList.size(); i++) {
String imageId = imagesIdList.get(i);
SysDocTO_2 docImg = super.getBaseDAO().queryForObject(SysDocTO_2.class, imageId);
if(null != docImg){
docImg.setSortIndex(i + 1);
super.getBaseDAO().update(docImg);
}
}
.......
}


SysDocTO_1和SysDocTO_2都继承了ISysDocTo接口,所以我想把这两块提取成一个公共方法如下:

public void updateMultipleImages(List<String> imagesIdList) {
for(int i = 0; i < imagesIdList.size(); i++) {
String imageId = imagesIdList.get(i);
ISysDocTo docImg = super.getBaseDAO().queryForObject(SysDocTO_1.class, imageId);
if(null != docImg){
docImg.setSortIndex(i + 1);
super.getBaseDAO().update(docImg);
}
}
}

但是在这个公共方法中我想使用ISysDocTo来取代SysDocTo_1 _2 却不行,因为queryForObject要求的是一个实体类对象,接口不行,请问这个要如何实现呢?
...全文
316 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码与酒 2016-07-28
  • 打赏
  • 举报
回复
引用 7 楼 zhang5476499 的回复:
http://bbs.csdn.net/topics/390713189,2014年写的帖子,那时候你挺牛X的,真不敢相信,楼主工作两年了只是这水平!
拆的一手好台....
finemi 2016-07-28
  • 打赏
  • 举报
回复
泛型、或者class
bikun526 2016-07-27
  • 打赏
  • 举报
回复
引用 7 楼 zhang5476499 的回复:
http://bbs.csdn.net/topics/390713189,2014年写的帖子,那时候你挺牛X的,真不敢相信,楼主工作两年了只是这水平!
哈哈你这个拆台啊
「已注销」 2016-07-27
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390713189,2014年写的帖子,那时候你挺牛X的,真不敢相信,楼主工作两年了只是这水平!
  • 打赏
  • 举报
回复
楼主要弄清楚ISysDocTo如果是接口的话,不可能实例对象的,接口本身就是个抽象概念,只有implements ISysDocTo的对象才能实例化。 可以这么设计,A类implements接口ISysDocTo,因此需要对接口进行实现(即公用方法) 而SysDocTO_1和SysDocTO_2是A类的子类 也可以这么设计ISysDocTo如果不是借口类,而是普通父类 queryForObject方法的入参和返回都为ISysDocTo即可实现子类的复用。
小灰狼 2016-05-18
  • 打赏
  • 举报
回复
从高一点的视角看,两个方案处理逻辑是一样的,但实际上是有细微差别的,方法的调用者通过调用不同的方法来体现这个不同 所以你必须在合并之后,方法的调用者要能够区别这种差别
Intboy 2016-05-18
  • 打赏
  • 举报
回复
我觉得用泛型解释你的问题更贴切 ISysDocTo docImg = super.getBaseDAO().queryForObject(SysDocTO_1.class, imageId); 你query的时候,已经指明了查询结果类型SysDocTO_1,而结果你却用接口接收,应该是父类或他自己。既然你已经指明了需要查询的类型,为什么接收的时候就不直接用这个类型呢?
尼坤神 2016-05-17
  • 打赏
  • 举报
回复
能否通过抽象类,向下转型的方式?
鬼狐柒 2016-05-17
  • 打赏
  • 举报
回复
http://www.dewen.net.cn/q/7213
rencht 2016-05-17
  • 打赏
  • 举报
回复
代码复用并不一定需要通过继承来实现。 两个类都调用只写一份的方法就行,可以把class作为参数传递。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧