抽象类和接口之间的区别

电脑杂谈  发布时间:2020-04-16 20:21:48  来源:网络整理

接口和抽象类的区别_idea 创建接口实现类_抽象类实现接口

抽象类和接口之间的区别之一1.抽象类: 抽象类是特殊的类,但是不能实例化;此外,它们还有阶级的其他特征. 重要的是抽象类可以包含抽象方法,而普通类则不能. 抽象方法只能在抽象类中声明,并且不能包含任何实现,派生类必须重写它们. 另外,可以从抽象类派生抽象类,并且可以重写基类的抽象方法. 如果不是,则派生类必须重写它们. 二,接口: 接口是一个引用类型,类似于该类,并且与抽象类有三个相似之处: 1.无法实例化; 2.包含未实现的方法声明; 3.派生类必须实现未实现的方法,抽象类是抽象方法,并且接口是所有成员(不仅包括其他成员的方法);此外,接口还具有以下特征: 除方法外抽象类实现接口,接口还可以包含属性,索引器和事件,并且这些成员都定义为公共. 此外,它不能包含任何其他成员,例如: 常量,字段,构造函数,析构函数,静态成员. 一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类). 第三,抽象类和接口之间的区别: 1.类是对象的抽象. 抽象类可以理解为对象类,抽象类称为抽象类. 接口只是行为的规范或规定. 自定义接口始终后面是enable字段,证明它是“我可以做...”的类. 抽象类在一系列紧密相关的类之间进行了更多定义,并且大多数接口是松散相关的,但是所有实现特定功能的类. 2.接口基本上没有继承的任何特定特征,它仅承诺可以调用的方法; 3.一个类可以一次实现多个接口,但只能扩展一个父类. 4该接口可用于支持回调,并且继承不具有此功能. 5.抽象类不能被密封.

6. 抽象类实现的具体方法默认为虚拟,但是实现接口的类中的接口方法默认为非虚拟,当然,您也可以将它们声明为虚拟. 7.(接口)类和非抽象类同样,抽象类必须为该类的基类列表中列出的接口的所有成员提供其自己的实现. 但是,允许抽象类将接口方法映射到抽象方法. 8.抽象类在oop中实现了一个原则,将变量与不可变分开. 抽象类和接口被定义为不可变的,并且实现了可变座位子类. 9.一个好的接口定义应该具有特定的功能,而不是,否则会导致接口污染. 如果一个类仅实现此接口的功能之一,而必须在该接口中实现其他方法,则称为接口污染. 10.尽量避免使用继承来实现组队功能,而要使用黑盒复用,即对象组合. 由于继承级别的提高,最直接的结果是,当您在该组中调用一个类时,必须将它们全部加载到堆栈中!后果可想而知. (结合对堆栈原理的理解). 同时,有兴趣的朋友可以注意到Microsoft在构造类时经常使用对象组合的方法. 例如,在asp.net中,Page类具有诸如Server Request之类的属性,但实际上它们都是特定类的所有对象. 使用Page类的该对象调用其他类的方法和属性是一个非常基本的设计原则.

接口和抽象类的区别_idea 创建接口实现类_抽象类实现接口

11. 如果抽象类实现了接口,则可以将接口中的方法作为抽象方法映射到抽象类,而无需实现,并且可以在抽象类的子类中的接口中实现这些方法. : 1.如果希望创建组件的多个版本,请创建一个抽象类. 抽象类提供了控制组件版本的简单方法. 2.如果创建的函数将在各种不同的对象之间使用,请使用该界面. 如果要设计小巧简洁的功能块,请使用该接口. 3.如果要设计大型功能单元,请使用抽象类. 如果要在组件的所有实现中提供通用的实现功能,请使用抽象类. 4.抽象类主要用于紧密相关的对象;和接口适合为不相关的类提供常规功能. 以下是我在互联网上看到的一些图像隐喻,它们确实很棒. 鸟的抽象类. 2.就像铁门和木门都是门(抽象类)一样,我不会给您门(无法实例化),但是我可以给您特定的铁门或木门(多态);它只能是门,不能说是窗口(单一继承);门可以具有锁(接口)或门铃(多种实现方式). 门(抽象类)定义了您的身份,接口(锁)规定了您可以执行的操作(接口最好仅做一件事,您不能要求锁发出声音(接口污染),并且抽象类将方法中的域与接口中的域进行比较-默认为静态,最终,公共,通常为常量,但也可以使用非常量表达式对其进行初始化.

这些字段不是接口的一部分,而是存储在接口的静态存储区中. 可以继承抽象类中的域,例如普通域. 它可以是私有的或静态的. ——————————————————————————————————————界面中的方法-默认是public,在那里可以没有特定的实现抽象类中的方法包含具体方法和抽象方法. 默认情况下,特定方法是虚拟的. 声明时,抽象方法不能为私有方法,也不能具有具体实现. 当抽象类实现接口时,它不需要实现特定的接口方法,而是允许其子类来实现它. 谈到抽象类和接口之间的区别,抽象类和接口是Java语言中支持抽象类定义的两种机制. 正是由于这两种机制的存在,Java才具有强大的面向对象功能. 抽象类和接口在支持抽象类定义方面有很大的相似性,甚至可以相互替代,因此许多开发人员在定义抽象类时似乎更随便地选择了抽象类和接口. 实际上,两者之间仍然存在很大差异,它们的选择甚至反映出对问题域的本质和设计意图的理解是否正确和合理.

接口和抽象类的区别_抽象类实现接口_idea 创建接口实现类

本文将分析它们之间的差异,试图为开发人员提供在两者之间进行选择的基础. 首先,了解抽象类. 广义抽象类用于提取抽象概念. 通用抽象类用于封装和隐藏抽象类和接口. 两者都用Java语言执行抽象类. ,它代表一个抽象体,而抽象类是一种用Java语言定义抽象类的方法,请注意区别),那么什么是抽象类,它可以给我们带来什么好处呢?在面向对象的概念中,我们知道所有对象都是由类描述的,但事实并非如此. 并非所有类都用于描述对象. 如果一个类没有足够的信息来描述特定的对象,则该类为抽象类. 抽象类通常用于表征我们从问题域的分析和设计中得出的抽象概念. 它们是一系列具体概念的抽象,这些概念看起来不同,但本质上是相同的. 例如: 如果我们开发图形编辑软件,我们会发现问题域中存在一些特定概念,例如圆形和三角形. 它们是不同的,但是它们都属于形状的概念. 形状的概念不在问题领域. 现有,这是一个抽象的概念.

正是因为抽象概念在问题领域中没有相应的具体概念,所以用于实例化抽象概念的抽象类无法实例化. 在面向对象领域,抽象类主要用于类型隐藏. 我们可以构造一组固定的行为抽象描述,但是这组行为可以有任何可能的具体实现. 此抽象描述是一个抽象类,该组的任何可能的具体实现都由所有可能的派生类表示. 该模块可以操作抽象主体. 由于模块依赖于固定的抽象主体,因此可能不允许对其进行修改. 同时,通过派生该抽象主体,还可以扩展该模块的行为功能. 熟悉OCP的读者必须知道,为了实现面向对象设计的核心原则之一OCP(开放式-封闭式原理),抽象类是关键. 第二,从语法定义的角度来看抽象类和接口在语法级别,Java语言给出了抽象类和接口的不同定义. 让我们以定义一个名为Demo的抽象类为例来说明这种差异. 抽象类是使用抽象类方法定义的,如下所示: 抽象类Demo {abstract void method1();使用接口定义Demo抽象类的方法如下: interface Demo {void method1(); void method2();…}在抽象类模式下,Demo可以具有自己的数据成员或非绝对成员方法,而在接口模式实现中,Demo只能具有不能被修改的静态数据Member(即,它们必须为static final,但通常不会在接口中定义数据成员),所有成员方法都是抽象的.

抽象类实现接口_idea 创建接口实现类_接口和抽象类的区别

从某种意义上说,接口是抽象类的一种特殊形式. 从编程的角度来看,抽象类和接口都可以用于实现“按合同设计”的想法. 但是,在特定用途上仍然存在一些差异. 首先,抽象类表示Java语言中的继承关系,而一个类只能使用一次该继承关系. 但是,一个类可以实现多个接口. 在考虑Java对多重继承的支持时,这可能是Java语言设计者的折衷方案. 其次,在抽象类的定义中,我们可以给出该方法的默认行为. 但是,在接口的定义中,方法不能具有默认行为. 为了绕过此限制,必须使用委托抽象类实现接口,但这会增加一些复杂性,有时会造成很大的麻烦. 还有一个严重的问题,即无法在抽象类中定义默认行为,即可能导致维护麻烦. 因为如果您以后想要修改类的接口(通常由抽象类或接口表示)以适应新情况(例如,在使用的方法中添加新方法或添加新参数),那么将很麻烦,这可能会花费很多时间(尤其是在派生类很多的情况下).

但是,如果接口是由抽象类实现的,则可能只需要修改抽象类中定义的默认行为. 同样,如果无法在抽象类中定义默认行为,则它将导致相同的方法实现出现在抽象类的每个派生类中,这违反了“一处繁琐”的原则,从而导致代码重复,这也是不利于将来的维护. 因此,在抽象类和接口之间进行选择时要非常小心. 3.从设计概念的角度来看,抽象类和接口抽象类代表一个继承关系,而派生类和父类则是一个“ is-a”关系. 接口表现为实现类和接口之间的类比关系. 它是“ like-a”关系. 主要从语法定义和编程的角度讨论抽象类和接口之间的区别. 这些级别之间的差异是相对较低的级别,是不必要的. 本文将从另一个层次分析抽象类和接口中反映的设计概念之间的差异. 作者认为,只有从这一层次的分析中,我们才能理解这两个概念的本质.

idea 创建接口实现类_抽象类实现接口_接口和抽象类的区别

如前所述,abstarct类反映了Java语言中的继承关系. 为了使继承关系合理,父类和派生类之间必须存在“是”关系,即,父类和派生类的概念应该基本相同. 接口不是这种情况. 不需要接口的实现者和接口的定义在概念上本质上相同,只需要实现接口定义的协定即可. 为了使讨论容易理解,下面将说明一个简单的示例. 考虑这样一个例子,假设在我们的问题域中有一个抽象的门概念,门有两个动作来执行打开和关闭操作,这时我们可以定义一个类型,该类型通过抽象类或接口来表示抽象概念. 定义方法如下: 使用抽象类定义Door: 抽象类Door {abstract void open();使用接口定义Door: 接口void {void open();}. void close(); }其他特定的门类型可以扩展使用抽象类定义的门或实现使用接口定义的门.

使用抽象类和接口似乎没有太大区别. 如果您现在需要门具有警报功能. 下面列出了如何设计本示例的类结构(在本示例中,主要是为了展示设计概念中反映的抽象类和接口之间的差异,已简化或忽略了与其他方面无关的其他问题)可能的解决方案,并从设计概念层面分析这些不同的解决方案. 解决方案1: 只需将警报方法添加到Door的定义中,如下所示: abstract class Door {abstract void open(); abstract void close();抽象void警报();}或界面Door {void open(); void close(); void alarm();}然后,具有警报功能的AlarmDoor定义如下: AlarmDoor类扩展Door {void open(){…} void close(){…} void alarm(){…}}或AlarmDoor类实现Door { void open(){…} void close(){…} void alarm(){…}}此方法违反了Door的面向对象设计ISP(接口隔离原则)中的核心原则. 门概念中固有的方法和另一个概念“警报”的行为方法混合在一起.

由此引起的问题是,仅依赖于门概念的那些模块将由于“警报”概念的更改而发生变化(例如: 修改警报方法的参数),反之亦然. 解决方案2: 由于打开,关闭和警报属于两个不同的概念,因此应根据ISP原则在代表这两个概念的抽象类中进行定义. 定义方法是: 两个概念都使用抽象类定义;这两个概念都是使用接口定义的;一个概念是使用抽象类定义的,另一个概念是使用接口定义的. 显然,由于Java语言不支持多重继承,因此在抽象类中定义这两个概念是不可行的. 后两种方法是可行的,但是它们的选择反映了对问题领域概念实质的理解以及设计意图反映的正确性和合理性. 我们将一一分析和解释. 如果使用接口方法定义了这两个概念,则会反映出两个问题: 1.我们可能无法清楚地理解问题域. 本质上,AlarmDoor是门还是警报器? 2.例如,如果我们对问题域的理解没有问题: 通过对问题域的分析,我们发现AlarmDoor在概念上与Door在本质上是相同的,那么我们在实现时就无法正确揭示我们的设计意图,因为在这两个概念的定义(均由接口定义)中,上述含义无法体现.

如果我们对问题域的理解是: AlarmDoor本质上是Door,并且还具有警报功能. 我们应该如何设计和实现以清楚地反映我们的意思?如前所述,抽象类表示Java语言中的继承关系,并且该继承关系实质上是“是”关系. 因此,对于门的概念,我们应该使用abstarct类进行定义. 另外,AlarmDoor具有警报功能,表示它也可以完成警报概念中定义的行为,因此可以通过界面定义警报概念. 如下所示: 抽象类Door {抽象void open();抽象的void close();}接口Alarm {void alarm();}类AlarmDoor扩展了门实现Alarm {void open(){…} void close(){…} void alarm(){…}}此实现基本上反映了我们的了解问题领域并正确揭示我们的设计意图.

实际上,抽象类表示“是”关系,而接口表示“类似”关系. 选择时可以将其用作基础. 当然,这是基于对问题域的理解,例如: 如果我们认为AlarmDoor本质上是一个警报,并且同时具有Door的功能,那么上述定义将被颠倒. 抽象类和接口是用Java语言定义抽象类的两种方法,它们有很大的相似性. 但是,对它们的选择通常反映了对问题领域概念实质的理解以及对设计意图的正确合理反映,因为它们显示了概念之间的不同关系(尽管它们都可以实现所需的功能). 这实际上是语言的常见用法.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-177983-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...