抽象类 & 接口
2017-01-21 12:30
155 查看
前言
最近一直在学习设计模式, 昨天学习完了,并且师父也给进行了验收,在验收的过程中,发现有一些问知识还是需要再梳理总结一下的,下面就让小编带领大家一起走进设计模式的世界吧。叙述
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对类的抽象。抽象类表示的是:这个对象是什么。接口表示的是:这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
下面具体来说一下这两个内容:
抽象类:
☀ 定义:只要一个类里面有一个方法是抽象方法,那么这个类就要定义为抽象类,抽象类也要使用“abstract”关键字来修饰
☀ 注意要点:
(1)抽象类不能实例化(实例化一个动物,一个动物长什么样,没有具体对象与之对应,实例化是没有意义的)
(2)抽象方法是必须被子类重写的方法(抽象方法可以被看成是没有实现体的虚方法)
(3)如果抽象类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。
abstract class Anmial //加abstract关键字,表明是抽象类 { //在方法返回前加abstract表明此方法是抽象方法,抽象方法没有方法体,直接在括号后“;” protected abstract string getShoutSound(); }
☀什么时候使用抽象类:
当你关注一个事物的本质的时候,用抽象类。抽象类是对类整体(字段、属性、方法)的抽象
抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。具体类不是用来继承的。(比如,猫狗牛羊是最后一级,那么他们就是具体类,但如果还有更下面一级的金丝猫继承于猫、哈巴狗继承于狗,就需要考虑把猫和狗改成抽象类了)
接口:
☀ 定义: 接口是把隐式公共方法和属性结合起来,以封装特定功能的一个结合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。
interface IChange { // 声明一个IChange接口,此接口有一个方法ChangeThing,参数是一个字符串变量,返回一个字符串 string ChangeThing(string thing); }
☀ 注意要点:
(1)声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。
(2)接口不能实例化,不能有构造方法和字段,不能有修饰符,方法没有方法体
(3)实现接口的类必须要实现接口中的所有方法和属性
(4)接口方法,访问权限必须是公共的 public
(5)接口内只能有公共方法,不能存在成员变量
(6)接口内只能含有未被实现的方法,也叫抽象方法,但是不用abstract关键字。
异同点:
(1)抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可实现多个接口
(2)类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象。
(3)如果行为跨越不同类的对象,可使用接口,对于一些相似的类对象,用继承抽象类。(比如猫狗都是动物,它们有很多相似的地方,让他们继承动物这个抽象类,而飞机、麻雀、超人是完全不相关的类,但它们的共同点是都会飞,让它们去实现飞这个接口)
(4)从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知子类的存在,方法如何实现还不确认,预先定义。(比如说猫狗,观察发现他们有类似之处,泛化出动物类。动物比赛,跑的最快,跳的最高,飞的最远等比赛项目,具体是谁来参加比赛不清楚,它们如何去实现这些行为也不知道,能做的就是事先定义这些比赛项目的行为接口)
(5)抽象类要被子类继承,接口要被类实现。
(6)接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
(7)抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类、
(8)抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
(9)抽象类里可以没有抽象方法,如果一个类里有抽象方法,那么这个类只能是抽象类
(10)抽象方法要被实现,所以不能是静态的,也不能是私有的。
(11)接口可继承接口,并可多继承接口,但类只能单根继承。
(12)抽象类 和 接口 都是用来抽象具体对象的. 但是接口的抽象级别最高
(13)抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量
(14)抽象类主要用来抽象类别,接口主要用来抽象功能.
(15)抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。
总结
其实想一想抽象类和接口也不是很难,多关注一下他们的不同点,放在例子中比较一下,会更好的理解的。相关文章推荐
- 抽象类 & 接口& 虚函数&纯虚函数&非虚函数
- Java Q&A: 抽象类和接口 - 实战练习
- java笔记(三)[java中的继承&java中的方法重载,重写,重构&java中的向上转型和乡下转型&java中的抽象类和接口&java中的接口向上转型]
- JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
- JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
- 接口 & 抽象类
- 抽象类 & 接口& 虚函数&纯虚函数&非虚函数
- JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
- 类 · 抽象类 ·接口 的 总结
- Java Abstract class( 抽象类 ) && Interface( 接口 )
- 抽象类 & 接口& 虚函数&纯虚函数&非虚函数
- 黑马程序员 Java基础<三>---> 抽象类、与接口
- JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别
- 黑马程序员&mdash;Java基础(接口,类,抽象类综合小练习)
- 抽象类 & 接口& 虚函数&纯虚函数&非虚函数
- 抽象类 ??--->接口
- 接口&抽象类
- Java基础<七>--->抽象类、接口、内部类、异常等
- 抽象类(Abstract) && 接口(Interface)区别比较
- Abstract&Interface 抽象类与接口