聚合类扩展基类 - 违反LSP?

时间:2011-01-21 18:42:40

标签: aggregate liskov-substitution-principle

维基百科上的Liskov Substitution Principle(LSP)


假设我有一个AliennumFingers属性*。有时,我需要从数据库中提取numFingers的总和,并按其他字段值进行分组。在这些情况下,我不需要单独操作每个记录,但我确实需要访问它们的许多功能 - 能够获取属性,对它们执行一些基本逻辑等。这可能包括数千个数据的总和记录,所以当数据库查询可以为我做总结工作时,实例化数千个Alien对象是没有意义的。

我想创建一个名为AlienAggregate的扩展类,其属性是从分组的&中设置的。总结查询。这个类允许我调用任何Alien的方法。这两个类的功能之间只有 的区别是GetID()。聚合类没有ID,因为它的数据来自任意数量的记录。因此,在GetID()上调用AlienAggregate会引发异常。

这违反了Liskov替代原则吗?有没有更好的方法来处理对GetID()的调用?有没有更好的方法来设计AlienAlienAggregate类之间的关系?

*实际名称可能因为我可以更改。

1 个答案:

答案 0 :(得分:1)

我认为您没有违反LSP,因为该原则仅适用于AlienAlienAggregate的子类型(或其他方式)。这里没有is a关系(更多的是Alien的聚合,因为你已经恰当地命名了它们)。

相反,它听起来像AlienAlienAggregate可能实现LooksAlien接口。 Alien类只有一个额外的方法GetID()。

...请注意BeginInvasion上的邪恶AlienAggregate方法。