何为抽象类?
在面向对象的概念中,所有的对象都可以用类来表示,但是并不是所有的类都有具体的对象可以对其实例化,所以这样的类就叫做抽象类。例如Animal类,说new Animal();实例一个动物,但是一个动物长什么样?不知道,动物就是一个抽象类,不能描述一个具体的对象与之对应。
C#允许把类和方法声明为abstract,即抽象类和抽象方法。抽象类应该拥有尽可能的共同的代码,拥有尽可能少的数据。
abstract class Animal //加abstract关键字,表明是抽象类
{
protected abstract string getShoutSound();
//在方法的返回值前加abstract表明此方法是抽象方法,抽象方法没有方法体,直接在括号后加“;”
}
C#中抽象的特点
1、抽象类不能被实例化
2、抽象方法是必须被子类重写的方法
3、如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含一般方法。
抽象类是提供一个抽象的概念,他提供一个继承的出发点,新的抽象类的建立,一定是用来继承的。在一个以继承关系形成的等级结构里面,树叶节点就是具体类,而树枝节均为抽象类。(这个相当在一棵树上,树叶继承树枝)
具体的内容请见下图:
何为接口?
接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所特定的所有属性和成员。声明接口在语法上于与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。
interface IChange
{
string ChangeThing(string thing);
//声明一个Ichangething接口,此接口有一个方法Changthing,参数是一个字符串变量,返回一字符串。
}
举个例子:抽象类——人;具体类——男人,女人;超人继承男人的所有方法和属性,但是超人有一个特殊技能:飞!如何实现?这个时候就用到的是接口。
抽象VS接口
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
概念上的比较
第一:类是对对象的抽象,抽象类是对类的抽象;接口是对行为的抽象。
第二:如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。
第三:从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口根本不知道子类的存在,方法实现还不能确认,预先定义。
这些内容都是从书本上提出的具体概念,有些其他的内容,其实更重要的是有我们自己的认识。
理解两者不同之处
1、接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
2、接口可以多继承,抽象类不行
3、接口定义方法,不能实现,而抽象类可以实现部分方法。
4、接口中基本数据类型为static 而抽类象不是的。
【总结】
当我们关注一个事物的本质的时候,用抽象类;关注一个操作的时候,用接口。抽象类的功能要远超过接口,但是定义抽象类的代价高,每个类只能继承一个类,在这个抽象类中必须写出其所有子类的所有共性。虽然接口的功能上会弱化很多,但是它只是针对一个动作的描述,而且我们可以在一个类中同时实现多个接口。