繁体   English   中英

类层次结构设计

[英]class hierarchy design

我想为我的Java项目定义一个类层次结构。 我的目的基本上是从电子邮件帐户中获取电子邮件,并根据网站的不同,使用IMAPPOP3将它们存储到数据库中(例如gmx支持IMAP而yahoo支持POP3 )。 我为此使用javamail API。 假设我有两个名为IMAPPOP3子类。 对应的方法如下:

POP3

  1. Execute_Parser
  2. 提取电子邮件
  3. 创建MSG摘要
  4. Get_Foldername
  5. 扫描表
  6. Store_Emailinfo

IMAP

  1. 提取电子邮件
  2. 创建MSG摘要
  3. 扫描表
  4. Store_Emailinfo

如您所见, POP3需要实现IMAP不需要的2种额外方法。 两种类的通用方法的实现都是相同的。 谁能在这里建议我应该在基类中放置哪些方法? 我猜这两个类都通用的所有IMAP方法。 但是POP3其他两种方法(Execute_Parser和Get_Foldername)又如何呢?

您可能要在基类中添加所有6个方法,并提供默认的空实现。 Pop3实现中,您将覆盖所有6种方法,而在Imap类中,仅需要4种方法。

现在,根据您的需要,您可能想添加其他方法来查询对象,是否需要调用Get_FoldernameExecute_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM