转自:http://www.51testing.com/?248559/viewspace-133065.html
一、概念
抽象类:顾名思义,抽象类首先是对类进行抽象的。而类是对对象进行抽象的 。当设计一个新的抽象类时,一定是用来继承的,定义一个抽象类,但不用来继承就失去了它的意义了。具体类不是用来继承的,只有抽象类是用来继承的。比如:猫,狗,牛,羊,是具体的类,此时可以把这些类的一些共性抽象出一个动物类,这个动物类就是抽象类。猫,狗,牛,羊继承动物类。
接口:接口是对行为的抽象,对类的局部(行为)进行的抽象,而抽象类是对类的整体(字段、属性、方法)的抽象。如果只关注行为抽象,那么也可以认为接口就是抽象类。不论是接口、抽象类、类,都是在不同层次、不同角度进行抽象的结果。他们的共性是抽象。
二、语法区别
抽象类:一定要在前面加abstract
abstract class Animal //加abstract关键字,表明是抽象类。
{
protected abstract string getShoutSound();
//在方法返回前加abstract表明此方法是抽象方法,它没有方法体直接在括号后加;
}
注意几点:第一,抽象类不能实例化,“动物“实例化是没有意义的;第二,抽象方法必须被子类重写。第三,如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法;第四,抽象类中可包含非抽象的方法(有具体实现的代码);第五,继承类可以部分实现抽象类中的抽象方法。第六,一个类只能继承一个抽象类。
接口:定义接口加interface
interface Ichange//接口名称前加I表示它是个接口
{
string ChangeThing(string thing);//方法前面不能有任何修饰符
}
注意几点:第一,接口不能实例化,不能有构造方法和字段,不能有修饰符,比如public、private等;第二,不能声明虚拟的或静态的方法;第三,实现接口的类就必须实现接口中的所有方法和属性。第四,一个类可以继承多个接口,多个类继承相同的接口。
三、设计的思维角度
从设计的角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类。这也体现了敏捷开发的思想,通过重构改善既有代码的设计。事实上,只有猫或狗这个类时,你就去设计一个动物类,很可能就过度设计了。所以说,抽象类往往是通过重构得来的,当然了,如果你事先意识到多种分类的可能,那么事先就设计出抽象类也完全是可以的。而接口是根本不知道子类的存在的,方法如何实现还不确认,预先定义了。可以这么说,抽象类是自底而上抽象出来的,而接口是自顶向下设计出来的。实现接口和继承抽象类并不冲突,比如,我们完全可以让超人继承人类,再实现飞行接口(我们平常人是不会飞的)。