嵌套继承与类

时间:2016-06-10 14:21:48

标签: class inheritance

我有一个关于子类如何从继承自基类的另一个子类继承的问题。请考虑以下内容:Triangle继承自Shape,RightTriangle继承自Triangle。我在下面有一张图片来描述这个场景。

RightTriangle是否可以直接从Shape继承(假设它也是一个形状)?

Imgur

2 个答案:

答案 0 :(得分:2)

“这取决于”。

如果类型是不可变的,那么“修改”操作会返回一个新实例,那么这可能会有效。

但如果有变异操作则不会。

考虑:

Rectangle rect = new Square(10); // Sides of length...
rect.SetWidth(20);

这是否意味着rect不再是正方形,它是否抛出,还是设置高度?所有三个结果都很糟糕(违反了Liskov)。

在不可变的情况下rect.SetWidth将返回一个新实例,每个子类型都需要用逻辑来编写,以便在需要时处理切换类型(例如,在上面的rect.SetWidth(10)中可以返回{{1因为两边保持相同的长度)。

虽然几何上的层次结构有效,但是因为在几何体中所有操作都会创建新的形状,然后您可以查看新形状的属性以对其进行分类。在具有可变对象的静态类型语言中,这些限制都不适用。

答案 1 :(得分:1)

第一部分:
RightTriangle是否可以直接从Shape继承
如果RightTriangle不从Traingle继承,则2016-06-10 15:25:55.788 Stock Controller[11404:834892] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath month not found in entity <NSSQLEntity Production_Day id=11>' Yes,如果RightTriangle继承自Traingle - &gt; C#不支持多继承 - &gt;编译错误

第二部分:
鉴于它也是一种形状
如果RightTriangle从Shape继承,则可以将其转换为Shape。