返回顶部
首页 > 资讯 > 精选 >abstract class和interface的本质是什么
  • 149
分享到

abstract class和interface的本质是什么

2023-06-17 23:06:13 149人浏览 独家记忆
摘要

本篇内容介绍了“abstract class和interface的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们知道abstr

本篇内容介绍了“abstract class和interface的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

我们知道abstract class和interface的不同在语法定义和编程的角度,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。

前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。

考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:

使用abstract class方式定义Door:

abstract class Door {   abstract void open();   abstract void close();   }

使用interface方式定义Door:

interface Door {   void open();   void close();   }

其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。

如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstract class和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。

解决方案一:

简单的在Door的定义中增加一个alarm方法,如下:

abstract class Door {   abstract void open();   abstract void close();   abstract void alarm();   }

或者

interface Door {   void open();   void close();   void alarm();   }

那么具有报警功能的AlarmDoor的定义方式如下:

class AlarmDoor extends Door {   void open() { … }   void close() { … }   void alarm() { … }   }

或者

class AlarmDoor implements Door {  void open() { … }  void close() { … }  void alarm() { … }  }

这种方法违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。

解决方案二:

既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstract class方式定义;两个概念都使用interface方式定义;一个概念使用abstract class方式定义,另一个概念使用interface方式定义。

显然,由于Java语言不支持多重继承,所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。

如果两个概念都使用interface方式来定义,那么就反映出两个问题:

我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?

如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。

如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示:

abstract class Door {  abstract void open();  abstract void close();  }  interface Alarm {  void alarm();  }  class AlarmDoor extends Door implements Alarm {  void open() { … }  void close() { … }  void alarm() { … }  }

这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。

结论

abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。

“abstract class和interface的本质是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: abstract class和interface的本质是什么

本文链接: https://lsjlt.com/news/294133.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • abstract class和interface的本质是什么
    本篇内容介绍了“abstract class和interface的本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们知道abstr...
    99+
    2023-06-17
  • abstract class和interface的区别是什么
    本文小编为大家详细介绍“abstract class和interface的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“abstract class和interface的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-06-03
  • abstract class和interface有什么不同
    这篇文章主要讲解了“abstract class和interface有什么不同”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“abstract class和interface有什么不同”吧!我...
    99+
    2023-06-17
  • interface和abstract class的区别
    interface和abstract class的区别interface和abstract class之间有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。 Abstract classInt...
    99+
    2020-06-17
    java教程 interface abstract class 区别
  • class在es6中本质是什么
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。es6的Class类详解class基本语法JavaScript 语言中,生成实例对象的传统方法是通过构造函数和原型的组合模式.ES6 提供了更接近传统语言...
    99+
    2022-11-22
    class ES6 javascript
  • 怎么使用Java中的abstract和interface
    本篇内容介绍了“怎么使用Java中的abstract和interface”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、简介abstrac...
    99+
    2023-06-25
  • TypeScript中的class和interface怎么用
    这篇文章主要介绍了TypeScript中的class和interface怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇TypeScript中的class和interface怎么用文章都会有所收获,下面我们...
    99+
    2023-06-27
  • const的本质是什么
    这篇文章主要介绍了const的本质是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇const的本质是什么文章都会有所收获,下面我们一起来看看吧。   并非真正的常量  ...
    99+
    2024-04-02
  • HTML5的本质是什么
    这篇文章将为大家详细讲解有关HTML5的本质是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  超文本标记语言(HTML)5 第一次向 HTML 中引入新的元素。新的...
    99+
    2024-04-02
  • css的本质是什么
    今天小编给大家分享一下css的本质是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。css的本质是定义元素的样式规则,告诉...
    99+
    2023-07-05
  • Python的本质是什么
    这篇文章主要介绍“Python的本质是什么”,在日常操作中,相信很多人在Python的本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • Linq本质是什么
    这篇文章主要介绍“Linq本质是什么”,在日常操作中,相信很多人在Linq本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linq本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!1.匿名类...
    99+
    2023-06-17
  • python import的本质是什么
    这篇文章主要讲解了“python import的本质是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python import的本质是什么”吧!说明import的本质是路径搜索。impo...
    99+
    2023-06-20
  • http代理的本质是什么
    这篇文章主要介绍“http代理的本质是什么”,在日常操作中,相信很多人在http代理的本质是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”http代理的本质是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-21
  • delete语法的本质是什么
    今天小编给大家分享一下delete语法的本质是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。delete 的返回值del...
    99+
    2023-07-05
  • css的本质是什么意思
    本教程操作环境:Windows10系统、CSS3版、DELL G3电脑css的本质是什么意思?css的本质是定义元素的样式规则,告诉浏览器如何在网页中显示元素。层叠样式表(英文全称:Cascading Style Sheets)是一种用来表...
    99+
    2023-05-14
    css
  • WEB开发的本质是什么
    一、WEB开发的本质是什么 WEB开发,主要指的是利用特定的编程语言和工具,构建和维护网络应用程序或网站的过程。它可以分为前端开发和后端开发两个部分,涵盖了从基本的HTML/CSS,到JavaScript,再到服务器端的Python,...
    99+
    2023-10-29
    本质 WEB
  • WEB的本质究竟是什么
    一、WEB的本质是什么 Web的本质是一个全面的信息处理和交互系统,它使得各种类型的信息能够在全球范围内进行分享和交流,从而为人们提供丰富的信息资源。Web通常包括网页内容、网络服务、数据交互和用户行为等模块。这种平台的使用,帮助人们...
    99+
    2023-10-29
    本质 WEB
  • c#委托的本质是什么
    委托是一种类型安全的指针,指向一个方法。它封装了方法引用,允许将方法作为参数传递,并提供了类型安全保障,强制方法签名与委托定义匹配。 委托的本质 委托本质上是一种类型安全的指针,它指向...
    99+
    2024-04-04
    c#
  • Web服务本质是什么
    本篇内容介绍了“Web服务本质是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 浏览器发请求 --&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作