天天看点

从抽象类到接口

假设有以下的类

1

从抽象类到接口

 public abstract class GunBase//枪械

2

从抽象类到接口

 {

3

从抽象类到接口

 public abstract void Shoot();//射击

4

从抽象类到接口

 public abstract ClipMode Clip//配置弹夹

5

从抽象类到接口

6

从抽象类到接口

 set;

7

从抽象类到接口

 get;

8

从抽象类到接口

 }

9

从抽象类到接口

 public abstract void Load();//装填弹药

10

从抽象类到接口

11

从抽象类到接口

12

从抽象类到接口

 public enum ClipMode

13

从抽象类到接口

14

从抽象类到接口

 Inside,

15

从抽象类到接口

 Outside

16

从抽象类到接口

我们当然它为抽象类,但这样一个抽象类,其没有构造函数,其所有成员也都完全是抽象的,我们还可以称其为纯抽象(虚)类。因为这个类,是完全的抽象的,但如果代码改为

从抽象类到接口
从抽象类到接口
从抽象类到接口
从抽象类到接口

 private ClipMode clipMode;

从抽象类到接口
从抽象类到接口
从抽象类到接口

 set

从抽象类到接口
从抽象类到接口

 clipMode = value;

从抽象类到接口
从抽象类到接口

 get

从抽象类到接口
从抽象类到接口

 return clipMode;

从抽象类到接口
从抽象类到接口
从抽象类到接口

17

从抽象类到接口

同样是抽象类,但修改后的类,就不再是纯抽象类了。纯抽象的类,我们要求是没有构造函数,没有任何的非抽象成员,所有成员的访问修饰都是public的,这样我们有了一个新的名词:接口interface。

现了解一下接口的定义要求

接口就是一个纯抽象类(所以接口是引用类型),接口可以包含方法、属性、事件和索引器,实现该接口的类或结构必须实现这些成员。

相比起抽象类,接口有以下特征

不需要声明接口为抽象或虚拟(本来就是)

接口不允许有构造函数(纯抽象了,根本不需要构造)

接口不允许有析构函数(本来无构造,何需有析构)

接口的所有成员都是抽象的(纯抽象类嘛)

接口只可以从接口继承(因为只有接口可以保证使纯虚的,如果从抽象类继承,不能保证抽象类中可能存在非抽象的成员)

接口成员不允许有任何修饰(默认就是public的,也只有是public的)

一个类或结构可以实现多个接口

那为什么要接口呢?

我们设想一个场景,假设我要写一个模拟角色的游戏,每个玩家都可以拥有多个角色(职业),如果有一个人其职业是医生,但同时他也是研究生,在学校带课,但又在攻读博士,同时呢,由于工作出色,担任了科室主任,在回家的路上又去了超市。

那我们可以观察到,这个人实现了的角色有:医生、学生、讲师、领导、顾客。那类怎么描述实现呢?用继承?

从抽象类到接口

 public class Person

从抽象类到接口
从抽象类到接口

 public string Name;

从抽象类到接口

 public Sex Sex;

从抽象类到接口
从抽象类到接口
从抽象类到接口

 public class Doctor : Person//医生

从抽象类到接口
从抽象类到接口

 public bool Operations()

从抽象类到接口
从抽象类到接口

 }//返回成功与否

从抽象类到接口

 public string Diagnosis()

从抽象类到接口
从抽象类到接口

 }//返回诊断意见

从抽象类到接口
从抽象类到接口
从抽象类到接口

18

从抽象类到接口

 public class Gaduate : Doctor //学生

19

从抽象类到接口

20

从抽象类到接口

 public void GotoClass()

21

从抽象类到接口

22

从抽象类到接口

23

从抽象类到接口

24

从抽象类到接口

 public int Exam()

25

从抽象类到接口

26

从抽象类到接口

27

从抽象类到接口

 }//作练习返回成绩

28

从抽象类到接口

29

从抽象类到接口

30

从抽象类到接口

 public class Professor : Gaduate//教授

31

从抽象类到接口

32

从抽象类到接口

 public void Disquisition()

33

从抽象类到接口

34

从抽象类到接口

35

从抽象类到接口

36

从抽象类到接口

37

从抽象类到接口

 public class Consumer : Professor//顾客

38

从抽象类到接口

39

从抽象类到接口

 public void stock()

40

从抽象类到接口

41

从抽象类到接口

42

从抽象类到接口

 public void paying(double cash)

43

从抽象类到接口

44

从抽象类到接口

45

从抽象类到接口

 }//支付

46

从抽象类到接口

如果你还有一点点面向对象的理智的话,就知道这个非常非常的错误的设计。不但类的结构非常的臃肿,还难以代码重用。

所以我们将代码改为使用接口来实现。

我们把job角色定义为接口,而不是类

从抽象类到接口

 public interface IDoctor//医生

从抽象类到接口
从抽象类到接口

 bool Operations();//返回成功与否

从抽象类到接口

 string Diagnosis();//返回诊断意见

从抽象类到接口
从抽象类到接口
从抽象类到接口
从抽象类到接口

 public interface IGaduate //学生

从抽象类到接口
从抽象类到接口

 void GotoClass();

从抽象类到接口

 int Exam();//作练习返回成绩

从抽象类到接口
从抽象类到接口
从抽象类到接口

 public interface IProfessor//教授

从抽象类到接口
从抽象类到接口

 void Disquisition();

从抽象类到接口
从抽象类到接口
从抽象类到接口

 public interface IConsumer

从抽象类到接口
从抽象类到接口

 void Stock();

从抽象类到接口

 void Paying(double cash);//支付

从抽象类到接口

这样Person 类就可以实现(继承)多个接口

从抽象类到接口

public class Person : IDoctor, IGaduate, IProfessor, IConsumer

从抽象类到接口
从抽象类到接口
从抽象类到接口
从抽象类到接口

 public int Age;

从抽象类到接口
从抽象类到接口
从抽象类到接口

 IDoctor 成员

从抽象类到接口
从抽象类到接口

 IGaduate 成员

从抽象类到接口
从抽象类到接口

 IProfessor 成员

从抽象类到接口
从抽象类到接口
从抽象类到接口
从抽象类到接口

 IConsumer 成员

58

从抽象类到接口

注意,IConsumer 成员采用的是显式实现。

标准实现的模型是:public 接口成员[返回值 名字 参数] {}

显式实现的模型是:没有访问修饰符 接口名称.接口成员[返回值 名字 参数] {}

显式实现的接口成员没有访问修饰符,也就意味着显式实现的成员感觉上是私有的,不能被访问。那这样的实现有什么意思呢?

请看下篇:我,只关心接口。

本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/806264

继续阅读