我有一个关于子类如何从继承自基类的另一个子类继承的问题。请考虑以下内容:Triangle继承自Shape,RightTriangle继承自Triangle。我在下面有一张图片来描述这个场景。
RightTriangle是否可以直接从Shape继承(假设它也是一个形状)?
答案 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。