我有两个数据模型,它们由以下类表示:

1) ImagesSet -一个拥有 2DImage 的对象,每个 2DImage 都有其自己的位置(origin( 3DPoint ),x-,y-axes(和xt以及3DVector轴) (以像素为单位)),但像素尺寸相同(例如,以mm为单位),x和y轴之间的角度(90度)

该对象具有以下方法(使用伪代码):

  • AddImage(2DImage);
  • RemoveImage(ImageIndex);
  • number GetNumberOfImages();
  • 2DImage Get2DImage(ImageIndex);

  • 2) 3DImage -与第一个对象相似,但有以下限制:
    它只能存储沿x和y轴具有相同x,y轴和尺寸的2D图像。

    在这种情况下,从 ImagesSet 派生 3DImage 是否正确?
    从我的角度来看 3DImage “是” ImagesSet (但有很小的限制)
    我可以在这里应用李斯科夫替代原则吗?

    在这种情况下,如果我们尝试添加具有其他x,y轴的图像-方法Addt 或将引发异常或返回错误。

    提前致谢,
    谢尔盖

    最佳答案

    我同意maxim1000认为将违反LSP,因为派生类添加了基类中不存在的限制。如果仔细看一下描述,您会发现问题可以颠倒过来:ImageSet可以从3DImage派生吗?

    您的情况有点类似于椭圆圆问题。哪个是从另一个派生的?圆是具有约束的椭圆,还是椭圆是具有附加半径的圆?关键是两者都是错误的。如果将椭圆约束为相等的半径,则尝试设置不同值的客户端将收到错误。

    否则,如果我们说椭圆只是约束较小的圆,则会得到一个更细微的错误。假设形状可能不会违反屏幕的边界。现在假设用椭圆代替了一个圆。根据测试的坐标,形状可能会在不更改客户端代码的情况下脱离屏幕区域。那就是对LSP的完全违反。

    结论是-圆形和椭圆形是单独的类; 3DImage和ImageSet是单独的类。

    07-24 14:12