Java 扩展实现另一个类的抽象类

Java 扩展实现另一个类的抽象类,java,class,interface,abstract,Java,Class,Interface,Abstract,我对OOP非常陌生,正在研究与解析器相关的项目代码。 它包含以下类和接口 public interface Parser { } public abstract class AbstractParser implements Parser{ } public class CSVParser extends AbstractParser{ } public class XMLParser extends AbstractParser{

我对OOP非常陌生,正在研究与解析器相关的项目代码。 它包含以下类和接口

    public interface Parser {
    }

    public abstract class AbstractParser implements Parser{
    }

    public class CSVParser extends AbstractParser{
    }

    public class XMLParser extends AbstractParser{
    }

我无法理解为什么要这样做?

接口
解析器
代表所有解析器必须提供的契约

AbstractParser
只实现该契约的一部分,即对所有解析器都相同的部分(如果有任何公共部分),还可能提供一些对实现具体类有用的受保护方法

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


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

这是一种基本的OOP设计,基本上是“接口而非实现的程序”的一个示例。,更清楚地阅读一下坚实的设计原则

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

要理解这段代码,您必须查看一下集合的JDK源代码。 在这里您将看到,
List、Set、Map
是接口,然后您有
AbstrictList、AbstractSet、AbstractMap
类,这些类被定义为抽象类,并具有一些方法的默认实现,如
size()
。然后,您可以实例化一些具体的实现,比如
ArrayList、HashMap、HashSet

我建议您完成Collections框架设计,也可以。

接口解析器可用于声明类似parse的方法及其返回类型和输入参数

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


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

接口仅定义签名,抽象类可以实现一些方法。谢谢!这种模式的名称是什么?我肯定它有一个名称,但在OOP出现之前(20世纪70年代),我就一直在使用它。我相信会有人插话说出“官方”的名字。我把它叫做“分解公共代码”。它基本上是“为接口而不是实现而编程”,请看我的答案,希望它能对您有所帮助。