inheritance - Liskov 原理和矩阵设计
问题描述
我正在尝试设计以下类:Matrix 和 SquareMatrix。他们都将能够进行基本的矩阵运算,并且 SquareMatrix 将另外能够检查它是否是对角线。所以,我正在考虑创建 Matrix 类,然后让 SquareMatrix 继承它。考虑 Liskov 原则是个好主意吗?因为起初它似乎是对正方形和矩形的基本违反,但当我想到它时,我找不到任何理由说明它是一个坏主意。有人可以指出我正确的方向吗?
解决方案
这取决于。
如果SquareMatrix
只是添加一个额外的方法来检查它是否是对角线,并且所有其他方法都可以保持原样,那么它可能没问题。将子类中的方法添加到继承类通常与 LSP 兼容。
但最有可能的是,您还想坚持该矩阵实际上是正方形的。因此,如果您的原始Matrix
类具有更改矩阵高度或宽度的功能,则您必须以某种方式在SquareMatrix
子类中“禁用”此功能。并且这种禁用与 LSP 不兼容。
如果您希望拥有一个单独的SquareMatrix
类,那么正常的路线将是MatrixInterface
使用所有矩阵共有的 API,AbstractMatrix
提供此接口的基本实现,ResizableMatrix
用于尺寸可以改变的矩阵,以及SquareMatrix
使用高度和宽度保证相等——后两者都继承自AbstractMatrix
.
如果这对您的用例来说过于复杂,一个更简洁的解决方案可能是向您的Matrix
类添加两个方法:isSquare
,它返回矩阵是否为正方形,以及isDiagonal
,在矩阵为正方形的假设(前提条件)下返回是否矩阵也是对角线。
推荐阅读
- php - 为什么我的 php 脚本在提交 post 请求时这么慢
- angular - npm install 后出错无法解析依赖关系
- node.js - 有没有办法在这个 reactjs 代码中获取这两个数组 ID?
- node.js - npm install discord.js 错误(npm ERR!代码1)
- r - 我正在尝试创建一个函数来计算向量中组内所有对组合的百分比差异
- c++ - 重载的提取运算符不会在 C++ 中成为朋友
- replace - NodeJS - 替换模块 - SyntaxError:意外的字符串
- javascript - 返回数组的异步函数,当访问时,返回一个不可迭代的对象
- c# - PuppeteerSharp 错误 No connection could be made because the target machine主动拒绝它 127.0.0.1:Port
- javascript - 运行 shell 命令并将响应保存到变量