在复习过程中我遇到了这样一个问题
根据LSP原则,一个不可变类型是否可以派生出一个可变的子类呢?
根据LSP原则,对于父类的方法,如果传入一个子类的对象,应该也能够正常执行。如果子类可变,那么把可变子类的对象赋值给父类时,客户端父类不可变特性的依赖就无法保持了。
从可替换性角度看,可变的子类是可以替换不可变的父类的,也不会对客户端中对父类已有的代码产生影响。但是,对父类这种不可变特性的依赖就不可靠了,即使子类方法是不会改变父类中所有的成员变量也不可靠。
我们并不知道子类的变化不会影响到需要的东西。
开始时我们使用父类A,可以完全信任它。现在给出一个子类B,是可变的,它是否能够保持对A的那些属性的不变,是难以保证的。另外,如果B的对象变了,导致hashcode之类的内容跟着变了,也会对A的操作产生影响。需要做很多额外的工作来消除或保证不产生这些影响。
那么子类就要给出非常强的保证,让客户端可以信赖。
假如对象的状态已经改变,可能我需要的内容没有变,但是子类对象确实可以变。为了验证我需要的内容没有变,就需要做额外的一些判断,但这样一来不可变这种特性的意义就没有了。
因此我认为一个不可变类型不应该派生出一个可变的子类。