假設有以下的類
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