0

维基百科上的里氏替换原则(LSP)


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

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

这是否违反了 Liskov 替换原则?有没有更好的方法来处理呼叫GetID()Alien有没有更好的方法来设计和类之间的关系AlienAggregate

*实际名称可能已更改,只是因为我可以。

4

1 回答 1

1

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

相反,它听起来像两者Alien,并且AlienAggregate可能实现了一个LooksAlien接口。该类Alien只有一个附加方法 GetID()。

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

于 2011-01-22T02:13:04.437 回答