一,区别:
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,当对人这个事物的抽象时,我们就可以定义人这个事物的公共抽象行为,同时实现了代码的复用,可能我们都是说的行为,但是我们说的结果不一样,那就是多态的定义了