CanSeek
技术上防止流类违反 LSP。只有当它返回真时,寻求承诺才会起作用。
我个人认为这是 ISP 和可能的 SRP 的严重弯曲,我的内部设计师会更喜欢像可SeekableStream
搜索流可以继承的子类/接口之类的东西。但我确信这会带来其自身的问题(例如,在仅有时可搜索的流中)......坦率地说,现实世界的可用性胜过原则。
这是需要牢记的。有时,原则和现实会发生冲突。在大多数情况下,SOLID 原则有助于最大限度地减少不必要的复杂性,并且通常保持 OO 系统可维护并防止它们因自身重量而崩溃。但是,如果纯度导致系统更加复杂——例如,因为现在只有有时可搜索的流不能很好地融入层次结构——那么偶尔的丑陋也许是合理的。
但它绝不应该仅仅因为法律条文允许就成为首选。SOLID 原则不仅仅是规则;他们是原则。它们是文字背后的思想——法律的精神。如果你在用律师的方式超越精神时坚持信条,那么你就错过了原则的全部要点。
至于方形/矩形问题......从技术上讲,可以考虑具有确定改变高度是否也会改变宽度的属性/函数,以符合 LSP 的字母。不过,再一次,它感觉就像是在做律师,并且正在推动其他 SOLID 原则的界限。从现实的角度来看,这也绝对不是最佳解决方案,因为它增加了复杂性并引入了意外副作用的可能性;现在所有想说的rect.Height = 50;
都可以无意中改变宽度。