天天看點

從抽象類到接口

假設有以下的類

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

繼續閱讀