簡體   English   中英

沒有多態的UML泛化

[英]UML generalization without polymorphism

是否有可能在兩個類之間建立泛化關系,其中子類會添加不在父類上的新操作(不覆蓋,不重載)? 這不是LSP違規嗎? 我不想多態,只是在子類中重復使用代碼。

編輯:超類是抽象的,部分定義

是的,UML允許在子類中定義超類中不存在的新操作。

這不一定違反《里斯科夫換人原則》。 在需要超類實例的情況下,可以替換子類的實例(但您不必利用它)。

但是,請確保您的子類的實例也可以真正視為超類的實例。 如果不是這種情況,而您只想重用代碼,則泛化不是正確的解決方案。

示例:StringCollection類具有操作排序。 現在,您想在名為FileManager的新類中重用此排序操作。 FileManager不僅是StringCollection,所以您不應使用概括。 相反,您可以使用“使用”依賴項(FileManager使用StringCollection)或組合(FileManager包含StringCollection)。

子類可以將新元素(如操作或屬性)添加到更通用的類中未定義的更特定的類。 同樣,更具體的類可以重寫函數,隱藏屬性並實現抽象操作。 我認為LSP意味着Liskov的替代原則。

如果違反或不違反該語法問題,則UML不能回答該問題; 相反,這是一個關於類的含義推理的語義問題。 考慮一個經典的例子,正方形是否比矩形更通用。 還是相反? 但是從語法上講,兩者是相同的,例如許多其他較少受質疑的層次結構。

關於多態的問題有些棘手。 UML沒有明確使用此術語。 但是它清楚地指出,更具體的類(標識符)的每個實例也是更通用的類(標識符)的實例,並且繼承了其所有功能。 這意味着沒有UML語法僅允許您繼承實現。

但是您可以通過應用合適的設計模式輕松解決此問題。 這個問題還不夠具體,不能斷定女巫模式是最合適的,但好的候選人是策略或橋梁模式。 然后,您將在實現算法的類之間擁有完全的繼承(並且它們可以是私有的或不可見的,具體取決於語言),但是客戶端使用的類沒有泛化關系,因此不能以多態方式使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM