关于继承关系中的可变与不可变类问题

在复习过程中我遇到了这样一个问题

根据LSP原则,一个不可变类型是否可以派生出一个可变的子类呢?

根据LSP原则,对于父类的方法,如果传入一个子类的对象,应该也能够正常执行。如果子类可变,那么把可变子类的对象赋值给父类时,客户端父类不可变特性的依赖就无法保持了。

从可替换性角度看,可变的子类是可以替换不可变的父类的,也不会对客户端中对父类已有的代码产生影响。但是,对父类这种不可变特性的依赖就不可靠了,即使子类方法是不会改变父类中所有的成员变量也不可靠。

我们并不知道子类的变化不会影响到需要的东西。
开始时我们使用父类A,可以完全信任它。现在给出一个子类B,是可变的,它是否能够保持对A的那些属性的不变,是难以保证的。另外,如果B的对象变了,导致hashcode之类的内容跟着变了,也会对A的操作产生影响。需要做很多额外的工作来消除或保证不产生这些影响。
那么子类就要给出非常强的保证,让客户端可以信赖。

假如对象的状态已经改变,可能我需要的内容没有变,但是子类对象确实可以变。为了验证我需要的内容没有变,就需要做额外的一些判断,但这样一来不可变这种特性的意义就没有了。

因此我认为一个不可变类型不应该派生出一个可变的子类。
 




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值