我有两个数据模型,它们由以下类表示:
1) ImagesSet -一个拥有 2DImage 的对象,每个 2DImage 都有其自己的位置(origin( 3DPoint ),x-,y-axes(和xt以及3DVector轴) (以像素为单位)),但像素尺寸相同(例如,以mm为单位),x和y轴之间的角度(90度)
该对象具有以下方法(使用伪代码):
2) 3DImage -与第一个对象相似,但有以下限制:
它只能存储沿x和y轴具有相同x,y轴和尺寸的2D图像。
在这种情况下,从 ImagesSet 派生 3DImage 是否正确?
从我的角度来看 3DImage “是” ImagesSet (但有很小的限制)
我可以在这里应用李斯科夫替代原则吗?
在这种情况下,如果我们尝试添加具有其他x,y轴的图像-方法Addt 或将引发异常或返回错误。
提前致谢,
谢尔盖
最佳答案
我同意maxim1000认为将违反LSP,因为派生类添加了基类中不存在的限制。如果仔细看一下描述,您会发现问题可以颠倒过来:ImageSet可以从3DImage派生吗?
您的情况有点类似于椭圆圆问题。哪个是从另一个派生的?圆是具有约束的椭圆,还是椭圆是具有附加半径的圆?关键是两者都是错误的。如果将椭圆约束为相等的半径,则尝试设置不同值的客户端将收到错误。
否则,如果我们说椭圆只是约束较小的圆,则会得到一个更细微的错误。假设形状可能不会违反屏幕的边界。现在假设用椭圆代替了一个圆。根据测试的坐标,形状可能会在不更改客户端代码的情况下脱离屏幕区域。那就是对LSP的完全违反。
结论是-圆形和椭圆形是单独的类; 3DImage和ImageSet是单独的类。