[英]class hierarchy design
我想為我的Java項目定義一個類層次結構。 我的目的基本上是從電子郵件帳戶中獲取電子郵件,並根據網站的不同,使用IMAP
或POP3
將它們存儲到數據庫中(例如gmx支持IMAP
而yahoo支持POP3
)。 我為此使用javamail API。 假設我有兩個名為IMAP
和POP3
子類。 對應的方法如下:
POP3
IMAP
如您所見, POP3
需要實現IMAP
不需要的2種額外方法。 兩種類的通用方法的實現都是相同的。 誰能在這里建議我應該在基類中放置哪些方法? 我猜這兩個類都通用的所有IMAP
方法。 但是POP3
其他兩種方法(Execute_Parser和Get_Foldername)又如何呢?
您可能要在基類中添加所有6個方法,並提供默認的空實現。 在Pop3
實現中,您將覆蓋所有6種方法,而在Imap
類中,僅需要4種方法。
現在,根據您的需要,您可能想添加其他方法來查詢對象,是否需要調用Get_Foldername
和Execute_Parser
方法(例如boolean isUseParserRequired ()
)。 如果我們假設您創建了一個EmailProtocol
抽象基類,並想以一種通用的方式使用它,那么您可能需要添加這樣的輔助方法。 它將允許您在處理EmailProtocol
實例時使用通用接口,而不必依靠if/else
確定您擁有哪種實例,然后調用適當的方法。
正如JB Nizet所提到的,您絕對應該堅持Java命名約定。
tl; dr子類化沒有意義,因為POP3和IMAP之間沒有IS-A關系
使用子類時,涉及的語義/動機非常不同。 一種是您嘗試為上下文中的兩個實體之間的某些自然IS-A關系建模。 您所處的問題是IMAP和POP3協議之間是否存在IS-A關系。 答案是否定的! IMAP協議不是從POP3派生的,它不兼容等。類層次結構的另一種語義集中在概念性接口上,這意味着您可以對類層次結構進行建模以實際以統一和多態的方式使用類的實例。 此方法的替代方法是不使用子類,而子類會導致類的緊密耦合,而是使用接口並通過組合模式共享公共代碼。
我會選擇使用接口並通過組合來共享通用代碼,因為使用這種方法,可以避免沒有IS-A關系的類的緊密綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.