首页 > 解决方案 > Liskov 原理和矩阵设计

问题描述

我正在尝试设计以下类:Matrix 和 SquareMatrix。他们都将能够进行基本的矩阵运算,并且 SquareMatrix 将另外能够检查它是否是对角线。所以,我正在考虑创建 Matrix 类,然后让 SquareMatrix 继承它。考虑 Liskov 原则是个好主意吗?因为起初它似乎是对正方形和矩形的基本违反,但当我想到它时,我找不到任何理由说明它是一个坏主意。有人可以指出我正确的方向吗?

标签: inheritancematrixliskov-substitution-principle

解决方案


这取决于。

如果SquareMatrix只是添加一个额外的方法来检查它是否是对角线,并且所有其他方法都可以保持原样,那么它可能没问题。将子类中的方法添加到继承类通常与 LSP 兼容。

但最有可能的是,您还想坚持该矩阵实际上是正方形的。因此,如果您的原始Matrix类具有更改矩阵高度或宽度的功能,则您必须以某种方式在SquareMatrix子类中“禁用”此功能。并且这种禁用与 LSP 不兼容。

如果您希望拥有一个单独的SquareMatrix类,那么正常的路线将是MatrixInterface使用所有矩阵共有的 API,AbstractMatrix提供此接口的基本实现,ResizableMatrix用于尺寸可以改变的矩阵,以及SquareMatrix使用高度和宽度保证相等——后两者都继承自AbstractMatrix.

如果这对您的用例来说过于复杂,一个更简洁的解决方案可能是向您的Matrix类添加两个方法:isSquare,它返回矩阵是否为正方形,以及isDiagonal,在矩阵为正方形的假设(前提条件)下返回是否矩阵也是对角线。


推荐阅读