【问题标题】:Extend abstract class which implement another class扩展实现另一个类的抽象类
【发布时间】:2016-06-13 07:44:21
【问题描述】:

我对 OOP 非常陌生,并且正在阅读与解析器相关的项目代码。 这包含以下类和接口。

    public interface Parser {
    }

    public abstract class AbstractParser implements Parser{
    }

    public class CSVParser extends AbstractParser{
    }

    public class XMLParser extends AbstractParser{
    }

我不明白为什么会这样?

【问题讨论】:

  • 接口只定义了签名,抽象类可以实现一些的方法。

标签: java class interface abstract


【解决方案1】:

它是一个基本的 OOP 设计,它基本上是 "Program for Interface rather than implementation" 的一个示例,为了更清楚地了解一下 SOLID 设计原则。

现在在这段代码中,有一个Parser 接口,所以如果任何类是解析器,那么它必须实现它,所以再一次,如果我们想给每个解析器一些默认行为,这就是为什么有 AbstractParser .

要理解这段代码,你必须看过一次 JDK 的 Collections 源代码。 在这里,您将看到,List, Set, Map 是接口,然后您有 AbstrictList, AbstractSet, AbstractMap 类,这些类被定义为抽象类,并且具有某些方法的默认实现,例如 size()。然后你就有了像ArrayList, HashMap, HashSet 这样的具体实现,你可以实例化它。 我会建议你一次完成 Collections 框架设计,SOLID principles 也是如此。

【讨论】:

    【解决方案2】:

    接口Parser 表示ALL 解析器必须提供的契约。

    AbstractParser 实现了该合约的部分,这些部分对于所有解析器都是相同的(如果有任何公共部分),并且还可能提供一些对实现有用的受保护方法具体类。

    CSVParserXMLParser 是具体的实现。他们使用AbstractParser提供的公共设施履行Parser的合同。

    这种模式是一种分解通用代码的方法,因此它只编写一次并由所有实现共享。具体的类只需要实现其特定要求所特有的代码。

    【讨论】:

    • 谢谢!这种模式叫什么名字?
    • 我确定它有一个名字,但在 OOP 存在之前(1970 年代)我就一直在使用它。我相信有人会用“官方”的名字来插话。我只是称之为“分解公共代码”。
    • 它基本上是“接口程序而不是实现程序”,请看我的回答希望它可以在一定程度上帮助你。
    【解决方案3】:

    接口 Parser 可用于声明 parse 等方法及其返回类型和输入参数。

    CSVParser 和 XMLParser 等实现类将使用覆盖典型面向对象行为的方法来定义方法主体。

    如果需要解析器,则在两者之间引入抽象类以引入任何状态,例如:FileHandle、LogHandle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2011-10-08
      • 2019-08-20
      • 1970-01-01
      相关资源
      最近更新 更多