从班级继承会在以后伤害你吗?

A-K*_*A-K 7 c# oop inheritance

你可以在我们从一个类继承的时候提供场景,它可以工作一段时间,但是其他东西会改变并引入一个bug吗?我想出了以下情况:

  • 为了实现Rectangle-with-hole,我们继承自Rectangle类.在构造函数中,我们检查孔是否在矩形内
  • 后来有人添加了一个新方法Resize到类Rectangle.他们不检查洞是否仍然在里面.
  • 在Resize之后,我们可以使用带有孔的矩形带孔而不是矩形内部,这是一个错误.

如果我选择在C#中使用对象继承,我应该注意哪些其他问题.

Chu*_*way 6

你所描述的是继承的一个陷阱.

另一个缺陷是深层继承层次结构.Stackoverflow线程上的继承组成.


man*_*aus 5

对基类的更改可以通过多种方式影响派生类的行为.如果作者突然决定以课堂sealed为例怎么办?

像任何界面一样,如果消费者不需要修改,它需要稳定.

具有继承性的主要"规则"是Liskov替代原则.这表明派生类应该可替代基类或从其派生的其他类.

这种情况在它的表面上打破了这个规则,因为带孔的矩形不是矩形.

通常,最好使用接口将行为划分为合理的可实现块.这种界面通常用形容词而不是名词命名.例如,对于矩形和带有孔的矩形都是有意义的,因此接口可能是IRenderable.如果它是可调整大小的,你可能有一个IResizable等等.这些可以聚合成一个IShape,但你要小心你的Shape定义只定义你的问题域中的行为.

直接派生自另一个类可能是危险的,因为您接受该类的行为约束.如果您真的需要这样做,最好将您需要的实现提取到一个公共基类(例如Rectangle : RectangleImplementation, IShape).