为什么 List 继承 Collection 接口时要重新 override 父接口的属性和方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhix
V2EX    Kotlin

为什么 List 继承 Collection 接口时要重新 override 父接口的属性和方法

  •  
  •   zhix 2017-10-11 10:44:22 +08:00 7060 次点击
    这是一个创建于 2927 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Collection 定义如下

    interface Collection<out E>: Iterable<E> { val siz: Int fun isEmpty(): Boolean // 剩下的定义 } 

    List 定义如下

    interface List<out E>: Collection<E> { override val size: Int override fun isEmpty(): Boolean // 剩下的定义 } 

    为何接口和抽象类在实现父接口时,有时候会手动 override 父接口的属性和方法呢?

    9 条回复    2018-11-26 21:44:12 +08:00
    zgbgx1
        1
    zgbgx1  
       2017-10-11 11:03:03 +08:00
    这就是 继承 和 多态,从 java 来说,List 和 Set 都继承 于 collection 接口,但是 List 和 Set 是不一样的
    zhix
        2
    zhix  
    OP
       2017-10-11 11:14:19 +08:00
    @zgbgx1 我的意思是,为何要重复声明一遍呢?就好比 Collection 的定义中也重复地 override 声明了 Iterable 的 iterator 方法
    zgbgx1
        3
    zgbgx1  
       2017-10-11 11:25:47 +08:00
    @zhix List 和 Set 都是继承于 Collection,他们也有各自的区别,所以设计的时候才需要重写,以实现各自的功能,重复声明一遍,当然还有可能为了 层次分明,在 List 和 Set 层规范 size 这个属性和 isEmpty 这个方法,方便 以后的开发。
    zgbgx1
        4
    zgbgx1  
       2017-10-11 11:28:29 +08:00
    @zhix 更多是 软件开发和设计模式的考虑
    vankid
        5
    vankid  
       2017-10-11 11:40:22 +08:00
    就像上面说的,我猜也是因为软件工程的原因。我理解是:Collection 有其他的继承者,如果只从 List 这一代来看或许你会觉得多余(事实上语法层面确实多余),但是 List 也有不同的继承者,那个时候你再看 List 的时候希望它是空白,而你需要继续往上翻才能看到声明吗?前面这才是三层,如果五层呢,类关系进一步复杂呢?在接口里重复声对当前接口非常重要的方法,这样就比较清晰了。
    zhix
        6
    zhix  
    OP
       2017-10-11 12:20:25 +08:00
    @vankid @zgbgx1 刚刚看了下 Java 中的声明,Queue 这个接口同样继承自 Collection,但是并没有显式声明 size、isEmpty,但是 List 和 Set 都有。但是 Queue 中声明的 add 和 offer 方法却在子接口 Deque 中被重新声明了。

    而且我注意到 Queue 的作者( Doug Lea )与 List/Set 的作者( Josh Bloch,Neal Gafter )不是同一人。所以我猜测重复声明一方面是个人习惯,另一方面是显式告知使用者该方法在当前上下文和父接口上下文中使用方式和含义的差别,比如 Queue 中的 poll 就是 poll,而 Deque 中的 poll 和 pollFirst 等价。
    kaneg
        7
    kaneg  
       2017-10-11 21:18:42 +08:00 via iPhone   1
    我猜还有一个作用,就是如果 List 放弃继承 Collection (我是说假如),那么 List 的子类也不会受影响,因为它还保留了一份方法申明
    zhix
        8
    zhix  
    OP
       2017-10-12 10:09:28 +08:00
    @kaneg 有道理
    aiyaa
        9
    aiyaa  
       2018-11-26 21:44:12 +08:00
    @kaneg 有道理
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4602 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:02 PVG 12:02 LAX 21:02 JFK 00:02
    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