一,区别:
1,接口可以多重继承
2,接口是特殊的抽象
3,抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。
4,抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
5,使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性
二,应用场景:
1》,我们有Chinese和English,都有自己独立的行为,这时我们就需要用到接口给他定义抽象的行为,而Chinese和English在这独立的行为中,我们又有相同的行为,这时我们可以定义people来给Chinese和English抽象公共的行为
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Interface { //抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。 //抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。 class Program { public interface IEnglishEvent //为中国人定义抽象行为 { void Speak(); } public interface IChineseEvent //为英国人人定义抽象行为 { void Eat(); } public abstract class People //对整个人类整体进行抽象 { public abstract void CommonSay(); } public class English : People, IEnglishEvent { public English() { CommonSay(); } public override void CommonSay() { Console.Write("我英国人"); } public void Speak() { Console.WriteLine("说英文"); } } public class Chinese : People, IChineseEvent { public Chinese() { CommonSay(); } public override void CommonSay() { Console.Write("我是中国人"); } public void Eat() { Console.WriteLine("吃饭"); } } static void Main(string[] args) { //如上代码,当我们将中国人和英国人分开为不同的对象时,各自定义不同的抽象行为时,我们需要用到接口 //但是也是在这个场景中,我们中国人和英国人又有相同的行为呢?难道是给每一个接口行为添加相同的接口么?如CommonSay(),虽然这是一种方法,但是我们有N种相同怎么办?这样代码不就是增加了代码的重复? //所以这时我们需要用到抽象类。我们将人这一实物抽象出来,给人定定义一个抽象方法,中国人和英国人都继承实现,这样人不就有共同的行为了么 IEnglishEvent en = new English(); en.Speak(); IChineseEvent ch = new Chinese(); ch.Eat(); } } }
三,如上代码,
1》当我们将中国人和英国人分开为不同的对象时,各自定义不同的抽象行为时,我们需要用到接口
2》但是也是在这个场景中,我们中国人和英国人又有相同的行为呢?难道是给每一个接口行为添加相同的接口么?如CommonSay(),虽然这是一种方法,但是我们有N种相同怎么办?这样代码不就是增加了代码的重复?
3》所以这时我们需要用到抽象类。我们将人这一实物抽象出来,给人定定义一个抽象方法,中国人和英国人都继承实现,这样人不就有共同的行为了么
四,那位什么说使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性?
1,我们的抽象类只能继承一个,而接口可以多继承,所以当我们抽象类是对一个事物的抽象,这个事物包含了行为等,而接口是属于这个事物的行为的抽象
2,当对人这个事物的抽象时,我们就可以定义人这个事物的公共抽象行为,同时实现了代码的复用,可能我们都是说的行为,但是我们说的结果不一样,那就是多态的定义了