维基百科上的Liskov Substitution Principle(LSP)
假设我有一个Alien
类numFingers
属性*。有时,我需要从数据库中提取numFingers
的总和,并按其他字段值进行分组。在这些情况下,我不需要单独操作每个记录,但我确实需要访问它们的许多功能 - 能够获取属性,对它们执行一些基本逻辑等。这可能包括数千个数据的总和记录,所以当数据库查询可以为我做总结工作时,实例化数千个Alien
对象是没有意义的。
我想创建一个名为AlienAggregate
的扩展类,其属性是从分组的&中设置的。总结查询。这个类允许我调用任何Alien
的方法。这两个类的功能之间只有 的区别是GetID()
。聚合类没有ID,因为它的数据来自任意数量的记录。因此,在GetID()
上调用AlienAggregate
会引发异常。
这违反了Liskov替代原则吗?有没有更好的方法来处理对GetID()
的调用?有没有更好的方法来设计Alien
和AlienAggregate
类之间的关系?
*实际名称可能因为我可以更改。
答案 0 :(得分:1)
我认为您没有违反LSP
,因为该原则仅适用于Alien
是AlienAggregate
的子类型(或其他方式)。这里没有is a
关系(更多的是Alien
的聚合,因为你已经恰当地命名了它们)。
相反,它听起来像Alien
和AlienAggregate
可能实现LooksAlien
接口。 Alien
类只有一个额外的方法GetID()。
...请注意BeginInvasion
上的邪恶AlienAggregate
方法。