您的位置:首页 > 其它

抽象类 & 接口

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)抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

总结

其实想一想抽象类和接口也不是很难,多关注一下他们的不同点,放在例子中比较一下,会更好的理解的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: