最近做个项目,记录一个督办事项的变更、反馈等信息,按时间排序。变更、反馈属于两种类型,所以只能分两张表存放。然后方案是做了个主表,记录变更或反馈的时间,然后每个主表的记录对应一个变更或一个反馈。现在做到返回值这里了,想用一个类型的对象接收变更或反馈记录。这里认为变更是一种类型,反馈是一种类型,想再定义一种类型继承他们的所有属性。何解?或者有别的思路?
1
sutra 2019-09-03 22:47:07 +08:00
interface
|
2
ebony0319 2019-09-03 22:47:44 +08:00 via Android
可以用静态内部类
|
3
lhx2008 2019-09-03 22:53:20 +08:00
没意义,本来就是两个玩意。把公共部分抽一个父类就行了。要不然就不要这样设计数据库表。
|
4
kaiyiliu123 OP @sutra 那个只能常量吧,我这里要用变量
|
5
kaiyiliu123 OP @ebony0319 具体怎么做?我刚才试了下没想到怎么做,还望指教
|
6
kaiyiliu123 OP @lhx2008 那如果两种类型混合排序有什么简洁的方法吗?
|
7
ebony0319 2019-09-03 23:01:29 +08:00 via Android
|
8
yidinghe 2019-09-03 23:07:42 +08:00 via Android
你要创建一个新的类,既属于变更又属于反馈,这样的类是做什么用的?
|
9
kaiyiliu123 OP @yidinghe 用于接收数据库数据,然后可能还会按分类转换类型,想先把数据接收到再说
|
10
yidinghe 2019-09-03 23:11:32 +08:00 via Android
建议参考 github 的 issue 是如何管理的,你可以从时间线上看到所有对于该 issue 的评论和操作,二者展示方式有所不同
|
11
tramm 2019-09-03 23:14:26 +08:00
把返回值赋值给变更&反馈的父类不就好了,然后判断到底是变更还是反馈.
不知道我的理解跟你说的是不是一个意思:D |
12
sutra 2019-09-03 23:22:01 +08:00
说的是这个意思吗:
``` public class Main3 { static interface Post { String getId(); } static class Change implements Post { @Override public String getId() { return "change-id"; } } static class Feedback implements Post { @Override public String getId() { return "feedback-id"; } } static class PostService { <T extends Post> T savePost(T t) { return t; } } public static void main(String[] args) { Change change = new Change(); System.out.println(new PostService().savePost(change).getId()); Feedback feedback = new Feedback(); System.out.println(new PostService().savePost(feedback).getId()); } } ``` |
13
ys1992 2019-09-03 23:38:23 +08:00 via Android
Java 是没有多继承的,多实现可以的!建议好好考虑一下业务场景,这里按照楼主的描述应该是变更和反馈业务类型不同但是流程一致,考虑复用性(偷懒 手动狗头),可以考虑定义抽象类或者定义接口类提供不同子实现
|
14
ys1992 2019-09-03 23:39:42 +08:00 via Android
具体业务参数带上变更或者反馈类型方便后续业务处理
|
15
pink123 2019-09-03 23:41:44 +08:00
@kaiyiliu123 楼主多去 Stack Overflow 去提问,这里不是提问的好地方,关于这个问题可以访问这里 https://stackoverflow.com/questions/21824402/java-multiple-inheritance
|
16
merpyzf 2019-09-04 00:09:07 +08:00 via iPhone
如果我来做的话我可能会再去定义一个包含两个类型的类。然后读取和写入的时候都进行一次转换就可以了。这个包含两个类型的类实际上就可以算作是 viewmodel,然后那个单独的类就是和数据表相对应的 entity。
|
17
aguesuka 2019-09-04 01:27:22 +08:00
1.Java 如何多继承呢?使用 interface,定义 default 方法.
按照我的理解,你是数据库里有三张表 ;主表主要有三个字段[类型,变更 /反馈主键,时间],然后你想把两张表查出来的数据放一个 List 里面去,因为你说了混合排序;如果我没理解错误的话,你的解决方案应该是[变更 /反馈]同时实现一个公共接口来作为 List 的泛型,里面的对象还是原来的对象,子类没有的字段就 return null; 不管是怎样,排序都可以 list.sort(Comparator.comparing(this::getTimeFromBean));来做. 我在山东做过一个督导考核的项目,听着这需求有点像我同事... |
18
leonme 2019-09-04 08:34:02 +08:00 via Android
内部类
|
19
jzq526 2019-09-04 08:38:07 +08:00
java 故意设计成了不支持多重继承,所以实现不了。但可以设计一个新的父类,包含你需要的所有内容。或者实现多个接口
|
20
rwecho 2019-09-04 10:45:52 +08:00
首先考虑组合 少用继承
|
21
zifangsky 2019-09-04 11:05:22 +08:00
感觉你的数据库设计不太合理,要么就设计一个表,专门用一个字段标识是“变更”类型还是“反馈”类型,要么就设计成两个基本没有联系的表(只是都有一个共同字段关联“督办事项”的 ID )。这样设计不就好做了吗?
|
22
kaiyiliu123 OP @zifangsky 注意审题哈,这是两种类型,比如变更表,可能有变更内容,变更说明,单据状态三个字段;反馈可能有反馈内容,反馈说明两个字段。这种怎么放在一个表里呢?不同类型还是分表放比较好吧?
|
23
zifangsky 2019-09-04 14:38:21 +08:00
@kaiyiliu123 #22 我不是都已经说了吗?两种类型区别不大就放在一个表,区别大就放在两个表。设计成两个表,大不了最后再设计一个类包含前面的两种类型(这属于组合方式而不是多继承),然后查 SQL 返回这个大类就可以了。
|
24
no1xsyzy 2019-09-04 15:50:01 +08:00
struct{typebyte, union{}} 这种做法呢?
把两个封装进去,然后另一成员变量描述是哪种呗 |
25
VKRUSSIA 2021-12-03 19:01:40 +08:00
只能組合了
|