2011-01-21 58 views
0

在维基百科上聚合类扩展基类 - 违反LSP?


Liskov Substitution Principle(LSP)说我有一个Alien类的numFingers属性*。偶尔,我需要从数据库中提取numFingers的总和,并按照其他字段值进行分组。在这些情况下,我不需要单独处理每条记录,但我确实需要访问它们的许多功能 - 能够获取属性,对它们执行一些基本逻辑等。这可能包括从数千记录,所以当数据库查询可以完成对我的求和工作时,实例化数以千计的对象是没有意义的。

我想做一个扩展类叫做AlienAggregate,它的属性是从分组的&总计查询中设置的。这个班会让我打电话给Alien的任何方法。 只有这两个类的功能区别,是GetID()。聚合类没有ID,因为它的数据来源于任意数量的记录。因此,拨打GetID()AlienAggregate会引发异常。

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

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

回答

1

我不认为你侵犯了LSP,因为当AlienAlienAggregate一个亚型(或者反过来)的原则只适用。这里没有is a的关系(更多的是Alien的聚合,因为你已经适当地命名了它们)。

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

...只是要小心AlienAggregate上的邪恶的BeginInvasion方法。

+0

我想让AlienAggregate扩展Alien,因为我需要两个类中的相同逻辑。 – keithjgrant 2011-01-22 16:09:16