publicabstractclassGunBase//枪械2


{3
publicabstractvoidShoot();//射击4
publicabstractClipModeClip//配置弹夹5


{6
set;7
get;8
}9
publicabstractvoidLoad();//装填10
}11

12
publicenumClipMode13


{14
Inside,15
Outside16
}
publicabstractclassGunBase//枪械2


{3
publicabstractvoidShoot();//射击4
privateClipModeclipMode;5
publicabstractClipModeClip//配置弹夹6


{7
set8


{9
clipMode=value;10
}11
get12


{13
returnclipMode;14
}15
}16
publicabstractvoidLoad();//装填17
}
同样是抽象类,但修改后的类,就不再是纯抽象类了。纯抽象的类,我们要求是没有构造函数,没有任何的非抽象成员,所有成员的访问修饰都是public的,这样我们有了一个新的名词:接口interface。
现了解一下接口的定义要求
接口就是一个纯抽象类(所以接口是引用类型),接口可以包含方法、属性、事件和索引器,实现该接口的类或结构必须实现这些成员。
相比起抽象类,接口有以下特征
不需要声明接口为抽象或虚拟(本来就是)
接口不允许有构造函数(纯抽象了,根本不需要构造)
接口不允许有析构函数(本来无构造,何需有析构)
接口的所有成员都是抽象的(纯抽象类嘛)
接口只可以从接口继承(因为只有接口可以保证使纯虚的,如果从抽象类继承,不能保证抽象类中可能存在非抽象的成员)
接口成员不允许有任何修饰(默认就是public的,也只有是public的)
一个类或结构可以实现多个接口
那为什么要接口呢?
我们设想一个场景,假设我要写一个模拟角色的游戏,每个玩家都可以拥有多个角色(职业),如果有一个人其职业是医生,但同时他也是研究生,在学校带课,但又在攻读博士,同时呢,由于工作出色,担任了科室主任,在回家的路上又去了超市。
那我们可以观察到,这个人实现了的角色有:医生、学生、讲师、领导、顾客。那类怎么描述实现呢?用继承?
publicclassPerson2


{3
publicstringName;4
publicSexSex;5
}6

7
publicclassDoctor:Person//医生8


{9
publicboolOperations()10


{11
}//返回成功与否12
publicstringDiagnosis()13


{14
}//返回诊断意见15
}16

17

18
publicclassGaduate:Doctor//学生19


{20
publicvoidGotoClass()21


{22

23
}24
publicintExam()25


{26

27
}//作练习返回成绩28
}29

30
publicclassProfessor:Gaduate//教授31


{32
publicvoidDisquisition()33


{34
}35
}36

37
publicclassConsumer:Professor//顾客38


{39
publicvoidstock()40


{41
}42
publicvoidpaying(doublecash)43


{44

45
}//支付46
}
如果你还有一点点面向对象的理智的话,就知道这个非常非常的错误的设计。不但类的结构非常的臃肿,还难以代码重用。
所以我们将代码改为使用接口来实现。
我们把job角色定义为接口,而不是类
publicinterfaceIDoctor//医生2


{3
boolOperations();//返回成功与否4
stringDiagnosis();//返回诊断意见5
}6

7

8
publicinterfaceIGaduate//学生9


{10
voidGotoClass();11
intExam();//作练习返回成绩12
}13

14
publicinterfaceIProfessor//教授15


{16
voidDisquisition();17
}18

19
publicinterfaceIConsumer20


{21
voidStock();22
voidPaying(doublecash);//支付23
}
这样Person 类就可以实现(继承)多个接口
publicclassPerson:IDoctor,IGaduate,IProfessor,IConsumer2


{3
publicstringName;4
publicSexSex;5
publicintAge;6

7

8

IDoctor成员#regionIDoctor成员9

10
publicboolOperations()11


{12
returnfalse;13
}14

15
publicstringDiagnosis()16


{17
return"";18
}19

20
#endregion21

22

IGaduate成员#regionIGaduate成员23

24
publicvoidGotoClass()25


{26
}27

28
publicintExam()29


{30
return0;31
}32

33
#endregion34

35

IProfessor成员#regionIProfessor成员36

37
publicvoidDisquisition()38


{39
}40

41
#endregion42

43

44

45

IConsumer成员#regionIConsumer成员46

47
voidIConsumer.Stock()48


{49

50
}51

52
voidIConsumer.Paying(doublecash)53


{54

55
}56

57
#endregion58
}
注意,IConsumer 成员采用的是显式实现。
标准实现的模型是:public 接口成员[返回值 名字 参数] {}
显式实现的模型是:没有访问修饰符 接口名称.接口成员[返回值 名字 参数] {}
显式实现的接口成员没有访问修饰符,也就意味着显式实现的成员感觉上是私有的,不能被访问。那这样的实现有什么意思呢?
请看下篇:我,只关心接口。
361

被折叠的 条评论
为什么被折叠?



