① 复合优于继承
本条内容的继承不包括接口继承。
复合就是在你的类中添加一个私有域,引用一个类的实例,使被引用类成为引用类的一个组件。
(1)继承不容易控制,使用不当容易导致软件非常脆弱,特别是继承不再同一个包下的类。
(2) 继承打破了父类的封装性 ,有的时候父类的内部实现改变,可能会导致子类遭到破坏。
举个比书上简单一点的例子,比如我们有个类,他包含一个集合,我们要并对外提供了两个api,分别是add(String str)和addAll(List<String> strs),具体的类如下:
然后我们需要记录这个类的从创建到销毁,一共添加过多少元素,如果我们想要用继承的方式,并且在不知道具体内部实现的前提之下,我们可能会这样写:
很明显,这样做是得不到我们想要的结果的,想要得到我们想要的结果,我们一般需要查看MyObject的具体实现,这就打纤脊破了封装性,好吧,看了具体实现之后我们知道怎么做了,丛兄那就是不覆盖addAll()方法。那问题又来了,如果在下一个版本中,MyObject的addAll()方法改了呢,改成想下面这样的:
这样的话MyChildObject又不能正常工作了,OMG。导致子类不能正常工作的原因还有很多,甚至父类中新添加一个类似add()的方法渗竖袭都会导致子类不能正常工作。所以这样的子类是异常脆弱的。
so,可以被继承的类要么在同一个包内(在同一个程序员的控制之下),要么是专门为继承而实际,并提供了很好的文档说明。
(3)看了第二点,你可能会觉得,我继承的时候只要不覆盖父类的方法不就可以了么?确实,相对于覆盖确实安全一些,不过这不是绝对安全, 当父类新增了一个方法,并且方法名和和参数都和父类相同,但返回值不同,那么子类将无法通过编译。如果返回值也相同的话,又回到了第二个问题。 同样导致了子类不健壮。
上面说到 继承 的缺点就是 复合 的优点。
在这里需要先解释一下 “转发“ 的概念,转发就是,你先复合一个类,然后在复合的类中实现所有被复合类的公有方法(api),实现的方式就是在相应的方法中调用被复合类的方法,并且不能被添加其他方法。比如为上面的MyObject写一个转发类:
转发类就是上面提到的, 专门为继承而设计的类 。
现在来阐述复合的正确使用姿势:
(1)为想要被继承的类设计一个转发类。
(2)继承这个转发类。
(3)覆盖想要覆盖的方法,或者添加想要添加的方法。
将例子写完,我们来快乐的继承 ForwardingMyObject 吧:
为什么不直接在在转发类中直接实现计数功能?这样好麻烦!
好吧,我承认,上面的例子太简单,不利于解释这个问题,主要是为了便于理解,那我们继续。
首先问个问题,我们在设计一个类的api的时候是直接在类中写一堆public的方法么?
什么?是的,好吧,你这种没追求的程序员快滚去睡觉吧,我不想和你聊天T_T。
我们在设计一个类的api的时候一般都是先将类的接口写出来,然后在用这个类来实现这个接口。
行,明白这里我们就来看书里的栗子吧,这里我把set改成list,联系下上文中的栗子:
转发类 :
包装类(相当于上面例子中的MyChildObject):
看到好处了么?现在我们写的InstrumentedList是一个真正List,不仅仅只是名字里有List而已!这意味着任何需要List作为参数的地方都可以把他传递过去!
不仅如此,它实现了一个传入List的构造方法,也就是说只要是实现了List的类都可以传递进去,什么ArrayList呀LinkedList都可以传进去并统计add了多少个元素。十分灵活!
不适合用于回调框架。
② 于继承简介
于继承黑龙江省佳木斯市退休干部。
于继承,1951年出生于佳木斯市。1987年,当体育碧搏教师的他改行到佳木斯市前进区人好则民法院,担任了院办公室主任。由于办公室工作繁杂,应酬又多,加上缺乏体育锻炼,身高1.74米的于继承,体重从150斤猛增到187斤,时常感到心慌气短。医生诊断结果是:严重的心脏病,并伴有重度脂肪肝。之后他隔三差五便犯病。由于长期服药,肾脏和血压也出了问题。50岁那年,颈椎病和腰椎间盘突出也找上了他……
在老伴反复劝说之下,于继承来到松花江畔开始锻炼,早晨沿江走步,晚上扭大秧歌,这一练就是3年。在这个过程中,自己发病的次数愈来愈少,手脚麻木的症状也逐渐消失了。友慧棚医生诊断重度脂肪肝变成了轻度脂肪肝,体重亦减了10公斤。他自己也感觉神清气爽,尝到了健身甜头。
与老伴儿密切配合 坚持创编“快乐舞步”
③ 买卖不破租赁适用于继承吗
买卖不破租赁不适用于继承,“买卖不破租赁”即在租赁关系存续期间,出租人将租赁物让与他人,对租赁关系不产生任何影响,买受人不能以其已成为租赁物的所有人为由否认原租赁关系的存在而要求承租人返还租赁物。“买卖不破租赁”即在租赁关系存续期间,出租人将租赁物让与他人,对租赁关系不产生任何影响,买受人不能以其已成为租赁物的所有人为由否认原租赁关系的存在而要求承租人返还租赁物。用比较通俗的语言来讲,就是说原租赁合同在买受竖衫人(新的所有人)和承租人之间继续有效,双方无须重新签订租赁合同,承租人可依据原租赁合同继续占有使用该租赁物,租金和使用条件按照原合同执行。我国《合同法》第229条规定:“租赁物在租赁期间发生所有权变动的,不影响租赁合同的效力”。《民通意见搏纤轮》119条规定,私有房屋在租赁期内,因买卖、赠与或者继承发生房屋产权转移的,原合同对租赁人和新房主继基信续有效。
④ 3年诉讼时效适用于继承吗
法律分析:因继承权产生纠纷的,适用三年的诉讼时效。自继承人知道或者应当知道其权利被侵犯之日起计算。但是,自继承开始之日起超过二十年的,不得再提起诉讼。
法律依据:《中华人民共和国民法典》
第一千一百二十三条 继承开始后,按照法定继承办理;有遗嘱的,按照遗嘱继承或者遗赠办理;有遗赠扶养协议的,按简迟照协议办理。
第一千一百二十七条 遗产按照下列顺序继承:(一)第一顺序:配偶、子女、父母;(二)第二顺序:兄弟姐袭衫妹、祖父拍咐腔母、外祖父母。继承开始后,由第一顺序继承人继承,第二顺序继承人不继承;没有第一顺序继承人继承的,由第二顺序继承人继承。本编所称子女,包括婚生子女、非婚生子女、养子女和有扶养关系的继子女。本编所称父母,包括生父母、养父母和有扶养关系的继父母。本编所称兄弟姐妹,包括同父母的兄弟姐妹、同父异母或者同母异父的兄弟姐妹、养兄弟姐妹、有扶养关系的继兄弟姐妹。