2011-01-21 86 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