抽象化 vs 抽象类与接口

6

我想了解抽象化,但是读了很多关于它的不同文章后感到非常困惑。

以下是我的问题,我无法理解:

1) "通过使用抽象类和接口可以实现抽象化吗?" 我已经搜索了这个问题,得到了三种不同的答案:

  • 这些答案不同,就像这里所解释的那样。
  • 它们是相同的,只是从不同的角度来看,就像这里所解释的那样。
  • 最后一种是使用抽象类来实现抽象化,就像这里所解释的那样。

哪一个是正确的?请给出一个简单的例子。


2) "抽象化意味着隐藏不必要的细节。例如,集中精力关注对象的功能而不是它是如何完成的。"

这是正确的吗?


3) 在抽象类中,我们可以定义具体实现和方法签名,并强制开发人员(使用抽象类的人)自己编写实现。那么,如果他正在编写自己的实现,它如何成为抽象化呢?我认为抽象化是为了隐藏实现。在接口中,开发人员必须编写每个方法的实现。

那么,这里的抽象化在哪里?


4) "抽象化"在词典中的定义是指"处理思想而不是事件的质量" - 我认为这是接口的正确定义,对于抽象类部分正确。但是,在计算机领域中,“抽象化”的定义是“隐藏不必要的细节”(简而言之)。

我在区分它们时是否正确?


请用例子或简单语句来解释/回答这个问题。

谢谢!

1个回答

4
一个抽象是一个概念,可以有一个或多个实现。
例如:你的计算机可以通过多种不同的方式连接到本地网络(以太网、Wi-Fi、ATM、拨号调制解调器等),但是你的 Web 浏览器通常不必担心你在任何时候使用了哪个,因为较低级别的软件提供了一个通用抽象,你的浏览器可以依赖它。所以“连接网络”是抽象,而以太网、Wi-Fi 等则是该抽象的实现。
你会注意到,到目前为止我还没有提到面向对象编程。那是因为实现抽象的想法适用于所有类型的设计和架构;它并不特定于 OOP。
在面向对象编程中,由于实现可能表示为由类指定的对象,因此通常将抽象指定为抽象类或接口。但这并不意味着抽象类和接口仅用于指定抽象,反之亦然,这并不意味着所有抽象都由抽象类和接口指定。例如,著名的设计模式(单例模式、工厂方法模式等)都是未在代码中明确指定的抽象;相反,我们有各种实现这些抽象的独立(无关)的代码片段,而抽象仅驻留在程序员的头脑中(以及设计文档、类和变量名称等)。
抽象用于类的客户端(用户)。当然需要有一个实现;但是,例如接受 List<String> 的代码不必担心传入的实例是 ArrayList 还是 LinkedList,因为它们都实现了所需的抽象。
即使是同一个开发人员编写实现代码和客户端代码,关注点的分离也可以使两个部分更容易维护;如果抽象被定义良好并且客户端代码从不“窥视”实现细节,则实现和客户端代码都可以更简单和更清晰。(即使“抽象”仅表达为 Javadoc,而不是实际接口,这也是正确的。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接