在两年前学习C++的时候,知道抽象类这么一个概念,当时并不是很理解,如今在学习C#和设计模式的时候,再一次碰到了这个含糊不清的东西,同时又在C#中学习到了接口技术,接口也早有耳闻,但是当时理解的接口就是一个或者一组能够操作类中数据的函数或者方法。虽然老师举过很多例子,比如电视机这个事物,它对外的接口就是遥控器,遥控器里好多的按钮,按钮的下面就是各种各样的命令或者称之为方法。
当抽象类遇到接口的时候,顿时蒙圈了,这两个概念的确是让人很难区别,那么我今天就来总结一下抽象类和接口到底有哪些区别和联系,以便能够深刻的理解和运用它们。
首先来看抽象类,抽象类是一种特殊的类,是为了抽象的目的而建立的,建立抽象类,就是为了通过它多态的使用其中的成员函数,为一个类族提供统一的操作界面。抽象类处于类层次的上层,一个抽象类自身无法实例化,也就是说我们无法声明一个抽象类的对象,而只能通过继承机制,生成抽象类的非抽象派生类,然后再实例化。
举个例子来讲,对于我们人类来讲,可以分为中国人、美国人、德国人等等,中国人还可以分出汉族和少数民族等。一个人,TA必定属于世界上的某个国家和某个民族。脱离国家和民族的纯粹“抽象”意义上的人是没有的。人类只是我们创造的一个高度抽象的概念,不存在人类本身的实例,但是由人类这个“抽象类”不断派生,我们可以得到各种各样的,特征不断具体化的“人”,最终得到一个具体的人。
抽象类有几点值得我们注意:第一,抽象类绝对不能实例化;第二,抽象方法必须被子类重写;第三,如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他的一般方法。第四,在声明抽象类的时候让其拥有尽可能多的共同代码,拥有尽可能少的数据。
抽象类通常代表一个抽象概念,它提供了一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。
在C#中我们用abstract关键字来声明类和方法为抽象类和抽象方法,抽象方法没有方法体,具体格式如下:
abstractclass 类名
{
public abstract string 方法名()
}
抽象类在C++中和C#是有所不同的,在C++中抽象类中的函数成员称为纯虚函数,同样也是没有函数体,并且在声明的时候必须初始化为0。具体的定义和语法格式就不再给大家介绍了,因为我们目前重点接触的是C#。