我是OOP的新手并且经历了与解析器相关的项目代码。 这包含以下类和接口。
public interface Parser {
}
public abstract class AbstractParser implements Parser{
}
public class CSVParser extends AbstractParser{
}
public class XMLParser extends AbstractParser{
}
我无法理解为什么要这样做?
答案 0 :(得分:1)
接口Parser
表示所有解析器必须提供的合同。
AbstractParser
只实现该合约的部分,所有解析器的部分相同(如果有任何公共部分),并且还可以提供一些有用的受保护方法实施具体课程。
CSVParser
和XMLParser
是具体实现。他们使用Parser
提供的公共设施履行AbstractParser
的合同。
此模式是一种分解公共代码的方法,因此它只编写一次并由所有实现共享。具体类只需要实现其特定需求所特有的代码。
答案 1 :(得分:1)
它是一个基本的OOP设计,它基本上是"Program for Interface rather than implementation"
的一个例子,更清楚地读一次关于SOLID设计原则。
现在在这个代码中,有一个Parser
接口,所以如果任何类是Parser那么它必须实现它,所以再次,如果我们想给每个解析器一些默认行为,那就是为什么那里是AbstractParser。
要理解此代码,您必须查看一次JDK源代码集合。
在这里,您将看到,List, Set, Map
是接口,然后您有AbstrictList, AbstractSet, AbstractMap
个类,这些类被定义为抽象类,并且具有某些方法的默认实现,如size()
。然后你有像ArrayList, HashMap, HashSet
这样的具体实现,你可以实例化它。
我会建议你一次完成收藏框架设计,并SOLID principles。
答案 2 :(得分:0)
接口Parser可以用来声明像解析这样的方法及其返回类型和输入参数。
像CSVParser和XMLParser这样的实现类将使用覆盖典型面向对象行为的方法来定义方法体。
引入抽象类以介绍解析器需要的任何状态,例如:FileHandle,LogHandle。