Java 如何多继承呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
kaiyiliu123
V2EX    Java

Java 如何多继承呢?

  •  
  •   kaiyiliu123 Sep 3, 2019 via Android 5569 views
    This topic created in 2434 days ago, the information mentioned may be changed or developed.

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

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

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

    按照我的理解,你是数据库里有三张表 ;主表主要有三个字段[类型,变更 /反馈主键,时间],然后你想把两张表查出来的数据放一个 List 里面去,因为你说了混合排序;如果我没理解错误的话,你的解决方案应该是[变更 /反馈]同时实现一个公共接口来作为 List 的泛型,里面的对象还是原来的对象,子类没有的字段就 return null;
    不管是怎样,排序都可以 list.sort(Comparator.comparing(this::getTimeFromBean));来做.
    我在山东做过一个督导考核的项目,听着这需求有点像我同事...
    leon0318
        18
    leon0318  
       Sep 4, 2019 via Android
    内部类
    jzq526
        19
    jzq526  
       Sep 4, 2019
    java 故意设计成了不支持多重继承,所以实现不了。但可以设计一个新的父类,包含你需要的所有内容。或者实现多个接口
    rwecho
        20
    rwecho  
       Sep 4, 2019
    首先考虑组合 少用继承
    zifangsky
        21
    zifangsky  
       Sep 4, 2019
    感觉你的数据库设计不太合理,要么就设计一个表,专门用一个字段标识是“变更”类型还是“反馈”类型,要么就设计成两个基本没有联系的表(只是都有一个共同字段关联“督办事项”的 ID )。这样设计不就好做了吗?
    kaiyiliu123
        22
    kaiyiliu123  
    OP
       Sep 4, 2019 via Android
    @zifangsky 注意审题哈,这是两种类型,比如变更表,可能有变更内容,变更说明,单据状态三个字段;反馈可能有反馈内容,反馈说明两个字段。这种怎么放在一个表里呢?不同类型还是分表放比较好吧?
    zifangsky
        23
    zifangsky  
       Sep 4, 2019
    @kaiyiliu123 #22 我不是都已经说了吗?两种类型区别不大就放在一个表,区别大就放在两个表。设计成两个表,大不了最后再设计一个类包含前面的两种类型(这属于组合方式而不是多继承),然后查 SQL 返回这个大类就可以了。
    no1xsyzy
        24
    no1xsyzy  
       Sep 4, 2019
    struct{typebyte, union{}} 这种做法呢?
    把两个封装进去,然后另一成员变量描述是哪种呗
    VKRUSSIA
        25
    VKRUSSIA  
       Dec 3, 2021
    只能合了
    About     Help     Advertise     Blog     API     FAQ     Solana     923 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 140ms UTC 18:30 PVG 02:30 LAX 11:30 JFK 14:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86