什么时候用抽象类,什么时候用接口 收藏

什么时候用抽象类,什么时候用接口 

“接口是完全抽象的成员集合,它的成员都无法在接口定义时实现,我们可以将它看作是为操作定义合同,接口的实现完全留给开发者去做。它们之间的区别,如果认真分析,还是有不少的:在JAVA中,类只能是从一个基类继承,所以如果要使用抽象类为一组类提供多态性,这些类必须都是从那个类继承的;接口就不一样了,它不但可以用一个类或结构实现多个接口,一个接口还可以有多个实现。” 
       抽象类是一种不能实例化而必须从中继承的类。抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通用功能,它可以提供已实现的成员,因此,可以用抽象类确保特定数量的相同功能,但不能用接口这样做。 
“也就是说,它们在提供多态性的问题上是有差别的?”我好象听懂了点什么。 
“如果预计要创建组件的多个版本,我们应该创建抽象类。这是因为,抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。这是好处,当然也是问题.另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。所以,如果创建的功能将在大范围的全异对象间使用,则使用接口。”------:“能不能这样说,抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。” 
我上午跟你说,要创建控件,首先就是要对一些接口进行实现以让系统能够识别(详见前文《接口》)。而各个控件之间的联系其实关联性并不大。所以,它们的基础大都是接口。但是,我们要注意一点,在组件设计时,如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。这是因为我们刚才说过的原因,抽象类允许部分实现类,而接口不包含任何成员的实现。” 

“唔,明白了,它们之间的区别有点明白了。”我默默地点了点头。 
       “另外,有个通用的设计思想,如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。” 
“看来设计的问题还是蛮大的,一般来说,怎么设计接口呢?”我接着问。 

“为什么你所看到的编程书籍也好,程序例程也好,极少有对接口的描述,而对类实现继承的例子比比皆是?这就从一个侧面给我们提了一个醒,如果使用适当,接口可以成为很有用的工具。但如果使用不当,它们会变得非常棘手,甚至妨碍有效的编程。接口的设计与使用其实是一项高明的艺术。” 

,“通过接口与实现的方式,我们可以将同一类型的程序运用在不同的对象上面,而且不必修改原有类,相对子程序必须通过修改源程序代码才能够达到重用的目的,接口与实现不仅是伟大的进步,也是境界极高的程序设计艺术。”   

“但是,最大的问题还是集中在接口设计上。接口一旦被定义和接受,就必须保持不变,以保护为使用该接口而编写的应用程序。接口发布后,就不能对其进行更改。这是我们进行组件设计的一个重要原则,叫做‘接口不变性’。”

“我已经反反复复强调过,创建一个接口就是在创建一个定义,接口定义发布后则永远不能更改。接口不变性,就是为了保护为使用接口而编写的现有系统。当接口设计与需求有所出入,确认需要大幅度变更时,我们应该创建新的接口。一般命名方式是,新接口可以通过在原来的接口名称后追加一个数字‘2’来命名,以显示出它与现有接口的关系。然后通过接口继承来创建新接口。” 

  “可是,如果需求分析得不好,岂不是会出现一大堆的派生接口了?”我不免有点顾虑。 

“这是肯定的,而且过于频繁地生成新接口,会因未使用的接口实现而使组件变得很庞大。有经验的设计师,在充分分析需求后,设计出的接口往往很小且相互独立,减少了性能问题发生的可能。” 

“这种分解能力倒真的是艺术呀!”我不禁为之叹服。 

“当然,一般来说,我们会把确定哪些属性和方法属于接口的设计过程称为‘接口分解’。基本准则是,应在一个接口中将紧密相关的几个功能聚合为一组。功能太多会使接口不便于运行,而过于细分功能将导致额外的系统开销并降低使用的简易性。掌握分解的这个度的能力是需要不断的在技术上进行磨炼,以及在对每个项目深入分析与理解的基础上才能得到的。” 

接口与类实现继承相比,好处有什么?”:“我试着说一下吧,总体而言,接口是一种非常有效的编程方法,它让对象的定义与实现分离,从而可以在不破坏现有应用程序的情况下使对象得以完善与进化。接口消除了实现继承的一个大问题,就是在对设计实施后再对其进行更改时很可能对代码产生破坏。即使实现继承允许类从基类继承实现,在类首次发布时仍然会使我们不得不为设计做很多的抉择。如果原有的设想不正确,并非总可以在以后的版本中对代码进行安全的更改。比如,我们定义了一个基类的方法,它需要一个 Integer 参数,而后来又确定该参数应该为 Long 数据类型。我们无法安全更改原始类,因为为从原始类派生的类所设计的应用程序可能无法进行正确编译。这一问题会扩大化,因为单个基类会影响几百个子类。” 

“那用重载原始类并采用一个Long类型的参数,不就能解决这个问题了吗?”大李提了个问题。 

“这个么?”我想了一下,“可是,这样不一定能达到满意的效果,因为一个派生类可能需要对采用整数的方法进行重写,如果取 Long 数据类型的方法不能被重写,该派生类可能无法正常运行。” 

“那用接口怎么做?”大李不依不挠地继续问。 

“办法就是发布接受新数据类型的更新接口。”我一下子就回答出来了。 

“看来你已经掌握了接口操作的基本环节了。”大李的评语真让我高兴。“我再帮你总结一下,使用接口继承而不用类继承的主要原因有:在应用程序要求很多可能不相关的对象类型以提供某种功能的情况下,用接口适用性会更强;接口比基类更灵活,因为可以定义单个实现来实现多个接口;在无需从基类继承实现的情况下,接口更好;在无法使用类继承的情况下接口是很有用的。例如,结构无法从类继承,但它们可以实现接口。”

时间: 2024-10-06 07:40:42

什么时候用抽象类,什么时候用接口 收藏的相关文章

Java面向对象思想、类、抽象类、多态、接口

文章末尾,有借鉴学习的说明,请仔细阅读,细化知识. 接口Interface: package com.wangku.classx; public interface InterfaceWK { /** * minus减法 * */ public abstract int xminus(int x,int y); } 抽象类Abstract Class: package com.wangku.classx; public abstract class AbstractWK { /** * add加

一个抽象类实现了某个接口,由这个抽象类派生的具体类了还实现了该接口?好处是什么?

问题描述 一个抽象类实现了某个接口,由这个抽象类派生的具体类了还实现了该接口?好处是什么?就是下面这样:interface InterfaceAA{}abstract class ClassBB implements InterfaceAA{}class ClassCC extends ClassBB implements InterfaceAA{} 问题补充:对众博友的回答进行了细致的分析,再加上自己的理解,你的回答我觉得是比较合理的.首先具体类ClassCC 不实现接口InterfaceAA

RHEL6.3下载接口收藏

1.虚拟化 提供一个 Virt-P2V工具,可以将windows和RedHat Linux的物理机转换成虚拟机,使用KVM进行部署. 可以进行文件卷的在线resizing,提高了虚拟机的可用性 增强qcow2磁盘镜像的存储性能,存取更加异步,从而降低vCPU占用和提高整体性能 对虚拟机进行性能监控,采用vPMU,可以在主机上诊断虚拟机的性能. 动态的vCPUs分配,不再需要重启,这个对计算资源伸缩有利(什么时候对内存可以在线伸缩?) 虚拟机的休眠状态,支持S3.S4(休眠到磁盘.休眠到内存) 2

php中抽象类和接口的概念以及区别

本篇文章是对php中抽象类和接口的概念以及区别进行了详细的分析介绍,需要的朋友参考下   复制代码 代码如下: //抽象类的定义: abstract class ku{ //定义一个抽象类 abstract function kx(); ...... } function aa extends ku{ //实现抽象类的方法 function kx(){ echo 'sdsf'; } } //使用方法 $aa=new aa; $aa->kx(); //1.定义一些方法,子类必须完全实现这个抽象中所

Java接口和抽象类实例分析

  本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类. 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体

《java与模式》笔记-----抽象类和接口

笔记 抽象类和接口 什么是接口:接口就是一些方法特征的集合------接口是对抽象的抽象. 什么是抽象类:抽象类对某具体类型的部分实现------抽象类是对具体的抽象. 方法特征包括:方法的名字.参数的数目.参数的类型.不包括:返回类型.参数名字.和抛出的异常. 接口是类型转换的前提.是动态调用的保证.实现某一接口就完成了类型的转换(多重继承):动态调用只关心类型,不关心具体类.          -------------------------------------------------

c#接口和抽象类的对比学习

什么是接口? 接口就是一种规范,协议(*),约定好遵守某种规范就可以写通用的代码. 定义了一组具有各种功能的方法.接口描述的是一种能力,具有这种能力的事物可以没任何关系.比如: public interface  IFly{void fly();} 实现这个接口的可以是飞机,鸟等,他们都有飞的能力但没什么关系.而抽象类就不同了. 接口解决了类的多继承的问题 接口解决了类继承以后体积庞大的问题. 接口之间可以实现多继承 接口中的成员必须不能有实现(没实现说白了就是不能有大括号哦),接口不能实例化.

C#成员访问和抽象类与接口

一.成员访问和属性 在定义类的时候我们要考虑成员的访问权限,在这里详细说明private加深大家对private的理解:如果类的成员是private那么在其他类中调用该类对象来访问它是非法的.下面举例说明: class Per { private string name; public string address; public int age; public Per() { name = "Upagn"; address = "changsha"; } } 在M

C#中抽象类和接口的区别

一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们. 二.接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1.不能实例化: 2.包含未实现的方法声明: 3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括