V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kaiyiliu123
V2EX  ›  Java

Java 如何多继承呢?

  •  
  •   kaiyiliu123 · 2019-09-03 22:39:56 +08:00 via Android · 4681 次点击
    这是一个创建于 1668 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做个项目,记录一个督办事项的变更、反馈等信息,按时间排序。变更、反馈属于两种类型,所以只能分两张表存放。然后方案是做了个主表,记录变更或反馈的时间,然后每个主表的记录对应一个变更或一个反馈。现在做到返回值这里了,想用一个类型的对象接收变更或反馈记录。这里认为变更是一种类型,反馈是一种类型,想再定义一种类型继承他们的所有属性。何解?或者有别的思路?

    25 条回复    2021-12-03 19:01:40 +08:00
    sutra
        1
    sutra  
       2019-09-03 22:47:07 +08:00
    interface
    ebony0319
        2
    ebony0319  
       2019-09-03 22:47:44 +08:00 via Android
    可以用静态内部类
    lhx2008
        3
    lhx2008  
       2019-09-03 22:53:20 +08:00
    没意义,本来就是两个玩意。把公共部分抽一个父类就行了。要不然就不要这样设计数据库表。
    kaiyiliu123
        4
    kaiyiliu123  
    OP
       2019-09-03 22:57:57 +08:00 via Android
    @sutra 那个只能常量吧,我这里要用变量
    kaiyiliu123
        5
    kaiyiliu123  
    OP
       2019-09-03 22:58:50 +08:00 via Android
    @ebony0319 具体怎么做?我刚才试了下没想到怎么做,还望指教
    kaiyiliu123
        6
    kaiyiliu123  
    OP
       2019-09-03 23:00:55 +08:00 via Android
    @lhx2008 那如果两种类型混合排序有什么简洁的方法吗?
    ebony0319
        7
    ebony0319  
       2019-09-03 23:01:29 +08:00 via Android
    yidinghe
        8
    yidinghe  
       2019-09-03 23:07:42 +08:00 via Android
    你要创建一个新的类,既属于变更又属于反馈,这样的类是做什么用的?
    kaiyiliu123
        9
    kaiyiliu123  
    OP
       2019-09-03 23:09:52 +08:00 via Android
    @yidinghe 用于接收数据库数据,然后可能还会按分类转换类型,想先把数据接收到再说
    yidinghe
        10
    yidinghe  
       2019-09-03 23:11:32 +08:00 via Android
    建议参考 github 的 issue 是如何管理的,你可以从时间线上看到所有对于该 issue 的评论和操作,二者展示方式有所不同
    tramm
        11
    tramm  
       2019-09-03 23:14:26 +08:00
    把返回值赋值给变更&反馈的父类不就好了,然后判断到底是变更还是反馈.
    不知道我的理解跟你说的是不是一个意思:D
    sutra
        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());
    }

    }
    ```
    ys1992
        13
    ys1992  
       2019-09-03 23:38:23 +08:00 via Android
    Java 是没有多继承的,多实现可以的!建议好好考虑一下业务场景,这里按照楼主的描述应该是变更和反馈业务类型不同但是流程一致,考虑复用性(偷懒 手动狗头),可以考虑定义抽象类或者定义接口类提供不同子实现
    ys1992
        14
    ys1992  
       2019-09-03 23:39:42 +08:00 via Android
    具体业务参数带上变更或者反馈类型方便后续业务处理
    pink123
        15
    pink123  
       2019-09-03 23:41:44 +08:00
    @kaiyiliu123 楼主多去 Stack Overflow 去提问,这里不是提问的好地方,关于这个问题可以访问这里 https://stackoverflow.com/questions/21824402/java-multiple-inheritance
    merpyzf
        16
    merpyzf  
       2019-09-04 00:09:07 +08:00 via iPhone
    如果我来做的话我可能会再去定义一个包含两个类型的类。然后读取和写入的时候都进行一次转换就可以了。这个包含两个类型的类实际上就可以算作是 viewmodel,然后那个单独的类就是和数据表相对应的 entity。
    aguesuka
        17
    aguesuka  
       2019-09-04 01:27:22 +08:00
    1.Java 如何多继承呢?使用 interface,定义 default 方法.

    按照我的理解,你是数据库里有三张表 ;主表主要有三个字段[类型,变更 /反馈主键,时间],然后你想把两张表查出来的数据放一个 List 里面去,因为你说了混合排序;如果我没理解错误的话,你的解决方案应该是[变更 /反馈]同时实现一个公共接口来作为 List 的泛型,里面的对象还是原来的对象,子类没有的字段就 return null;
    不管是怎样,排序都可以 list.sort(Comparator.comparing(this::getTimeFromBean));来做.
    我在山东做过一个督导考核的项目,听着这需求有点像我同事...
    leonme
        18
    leonme  
       2019-09-04 08:34:02 +08:00 via Android
    内部类
    jzq526
        19
    jzq526  
       2019-09-04 08:38:07 +08:00
    java 故意设计成了不支持多重继承,所以实现不了。但可以设计一个新的父类,包含你需要的所有内容。或者实现多个接口
    rwecho
        20
    rwecho  
       2019-09-04 10:45:52 +08:00
    首先考虑组合 少用继承
    zifangsky
        21
    zifangsky  
       2019-09-04 11:05:22 +08:00
    感觉你的数据库设计不太合理,要么就设计一个表,专门用一个字段标识是“变更”类型还是“反馈”类型,要么就设计成两个基本没有联系的表(只是都有一个共同字段关联“督办事项”的 ID )。这样设计不就好做了吗?
    kaiyiliu123
        22
    kaiyiliu123  
    OP
       2019-09-04 13:16:31 +08:00 via Android
    @zifangsky 注意审题哈,这是两种类型,比如变更表,可能有变更内容,变更说明,单据状态三个字段;反馈可能有反馈内容,反馈说明两个字段。这种怎么放在一个表里呢?不同类型还是分表放比较好吧?
    zifangsky
        23
    zifangsky  
       2019-09-04 14:38:21 +08:00
    @kaiyiliu123 #22 我不是都已经说了吗?两种类型区别不大就放在一个表,区别大就放在两个表。设计成两个表,大不了最后再设计一个类包含前面的两种类型(这属于组合方式而不是多继承),然后查 SQL 返回这个大类就可以了。
    no1xsyzy
        24
    no1xsyzy  
       2019-09-04 15:50:01 +08:00
    struct{typebyte, union{}} 这种做法呢?
    把两个封装进去,然后另一成员变量描述是哪种呗
    VKRUSSIA
        25
    VKRUSSIA  
       2021-12-03 19:01:40 +08:00
    只能組合了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   994 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:00 · PVG 04:00 · LAX 13:00 · JFK 16:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.