通过从Rectangle继承的Square类显示了OOP的某些失败,逻辑上Square是Rectangle的特化,因此应该继承自矩形,但是当您尝试更改Square的长度或宽度时,一切都会崩溃。
是否有一个特定的术语来描述这种情况出了什么问题?
2
您能否解释一下“出问题了”的确切含义?我不明白你的意思
—
蚊蚋
假设矩形具有一种允许通过传递长度和宽度来设置大小的虚拟方法,则在正方形上设置不同的长度和宽度可能会返回一个矩形,而在矩形上设置相同的长度和宽度则可能会返回一个正方形。任何需要明确知道平方的代码都可以尝试转换为平方。我看不出怎么回事...
这不是悖论。这是问题域建模不正确的情况。继承层次结构不一定要与问题域中事物的层次结构保持一致。这样做的确很不错,但是好的模型中的诀窍是要了解在哪里您需要做的事情与现实世界有所不同。
—
迈克尔·科恩
FWIW:更具体地说,问题是读写接口不匹配。即,您可以将圆作为椭圆的特化来读取,但只能将椭圆作为圆的特化来编写。
—
Macke
@GrandmasterB我要经过“表现出明显矛盾性质的任何人,事物或情况”。矛盾的是,如果正方形具有不同的属性,那么我们必须说“正方形不是某种矩形”,而实际上我们希望正方形是矩形的子类型。可能没有真正的应用程序具有Rectangle和Square类型,这只是说明可能出现在基于类的范式中的某种类型问题的抽象。
—
维克多