不忘(wang)本~接口
接口無疑是面向對象的(de)(de)程序設計中(zhong)最(zui)重要的(de)(de)概(gai)念之一(yi),它(ta)體現(xian)一(yi)種(zhong)抽象,一(yi)種(zhong)規范(fan);即它(ta)只規定(ding)了具體的(de)(de)操(cao)作(zuo),而不對操(cao)作(zuo)進(jin)行實(shi)現(xian),它(ta)的(de)(de)實(shi)現(xian)由繼承它(ta)的(de)(de)類去完成(cheng);它(ta)是一(yi)種(zhong)規范(fan),即,它(ta)要求實(shi)現(xian)它(ta)的(de)(de)類要對它(ta)的(de)(de)成(cheng)員完全實(shi)現(xian)才行.
看一段代碼:
1 /// <summary> 2 3 /// 武器攻擊的通用接口 4 5 /// </summary> 6 7 public interface IAttack 8 9 { 10 11 /// <summary> 12 13 /// 攻擊(ji)(ji)方(fang)法,被攻擊(ji)(ji)對象是一個敵(di)人對象 14 15 /// </summary> 16 17 /// <param name="Enemy"></param> 18 19 VCommons.VMessage Attack(Entity.Enemy Enemy); 20 21 }
對接口進行(xing)實現,看(kan)代碼:
1 /// <summary> 2 3 /// 木(mu)頭攻擊 4 5 /// </summary> 6 7 public class WoodAttack : Entity.IAttack 8 9 { 10 11 12 13 #region IAttack Members 14 15 16 17 public VCommons.VMessage Attack(Entity.Enemy enemy) 18 19 { 20 21 return enemy.Notify(20); 22 23 } 24 25 26 27 #endregion 28 29 } 30 31 /// <summary> 32 33 /// 鐵棒(bang)攻擊 34 35 /// </summary> 36 37 public class MagicAttack : Entity.IAttack 38 39 { 40 41 42 43 #region IAttack Members 44 45 46 47 public VCommons.VMessage Attack(Entity.Enemy enemy) 48 49 { 50 51 return enemy.Notify(50); 52 53 } 54 55 56 57 #endregion 58 59 }
除了(le)上面的(de)接(jie)(jie)口之外,還有(you)(you)一(yi)種特殊(shu)的(de)接(jie)(jie)口,它(ta)內部(bu)沒有(you)(you)任何元素,我們稱為(wei)標記接(jie)(jie)口。它(ta)不是(shi)(shi)為(wei)了(le)調(diao)用者的(de)期待(dai)而定義,其意圖是(shi)(shi)抽(chou)(chou)象,將那些不能抽(chou)(chou)象在(zai)一(yi)起的(de)類(lei),利(li)用一(yi)個標記綁定起來,為(wei)其提供統(tong)一(yi)的(de)接(jie)(jie)口。標記接(jie)(jie)口保證了(le)調(diao)用方法的(de)一(yi)致性。雖然(ran)強制類(lei)型轉(zhuan)換會(hui)引入具體依賴,卻不會(hui)有(you)(you)任何副作(zuo)用,因為(wei)在(zai)方法實(shi)現(xian)中,設計者的(de)期待(dai)本身就是(shi)(shi)要轉(zhuan)換的(de)類(lei)型.
看(kan)代碼:(對象實(shi)現統(tong)一(yi)接口和對象具體(ti)實(shi)體(ti)類)
1 /// <summary> 2 3 /// 數(shu)據(ju)庫對象統一協調接口 4 5 /// </summary> 6 7 public interface IDataEntity 8 9 { 10 11 12 13 } 14 15 /// <summary> 16 17 /// 活躍值明細 18 19 /// </summary> 20 21 public partial class ActiveRecord : IDataEntity 22 23 { 24 25 //初始字段 26 27 #region original field 28 29 30 31 /// <summary> 32 33 /// 活躍值明細ID 34 35 /// </summary> 36 37 public String ActiveRecordID { get; set; } 38 39 40 41 /// <summary> 42 43 /// 所有(you)人ID 44 45 /// </summary> 46 47 public String UserID { get; set; } 48 49 50 51 /// <summary> 52 53 /// 值(zhi) 54 55 /// </summary> 56 57 public Int32 Value { get; set; } 58 59 60 61 /// <summary> 62 63 /// 收支(zhi)類(lei)型(xing) [資金流(liu)向],0-收入,1-支(zhi)出 64 65 /// </summary> 66 67 public Entity.FlowType FlowType { get; set; } 68 69 70 71 /// <summary> 72 73 /// 備注(zhu) 74 75 /// </summary> 76 77 public String Note { get; set; } 78 79 80 81 /// <summary> 82 83 /// 時間 84 85 /// </summary> 86 87 public System.DateTime Createdate { get; set; } 88 89 90 91 /// <summary> 92 93 /// 活躍(yue)值明細類(lei)類(lei)型 [默認為1, 為了以后(hou)做擴展使用] 94 95 /// </summary> 96 97 public Int16 Type { get; set; } 98 99 100 101 #endregion 102 103 104 105 //外延字段 106 107 #region extensional field 108 109 110 111 #endregion 112 113 114 115 //構(gou)造函數 116 117 #region constructed function 118 119 120 121 /// <summary> 122 123 /// 新建立的時候(hou)構造(zao)函數(shu) 124 125 /// </summary> 126 127 public ActiveRecord() 128 129 { 130 131 132 133 } 134 135 136 137 /// <summary> 138 139 /// 新(xin)建立的時(shi)候(hou)構(gou)造函數 140 141 /// </summary> 142 143 /// <param name="_ActiveRecordID">活躍值(zhi)明細ID</param> 144 145 public ActiveRecord(String _ActiveRecordID ) 146 147 { 148 149 this.ActiveRecordID = _ActiveRecordID ; 150 151 152 153 } 154 155 156 157 #endregion 158 159 160 161 //方法 162 163 #region function 164 165 166 167 #endregion 168 169 170 171 //重寫方法 172 173 #region object overrides 174 175 176 177 #endregion 178 179 }
而在操作統一接(jie)口調用(yong)實體(ti)時,我們可以(yi)直接(jie)寫(xie)(xie)成接(jie)口類,而不用(yong)寫(xie)(xie)用(yong)具體(ti)類型
1 /// <summary> 2 3 /// 通(tong)用數據庫(ku)訪問接(jie)口 4 5 /// </summary> 6 7 public interface IRepository 8 9 { 10 11 /// <summary> 12 13 /// 根據(ju)(ju)數據(ju)(ju)庫實體—》更新記錄 14 15 /// </summary> 16 17 /// <param name="entity"></param> 18 19 void Update(IDataEntity entity); 20 21 }
注意(yi),在實現時(shi),我們需(xu)要將(jiang)接口對象進行(xing)強(qiang)類(lei)型(xing)轉換,這(zhe)在標記(ji)接口中是可以(yi)的(de).
1 public void Update(Entity.IDataEntity entity) 2 3 { 4 5 Entity.UserPointRecord _entity = entity as Entity.UserPointRecord; 6 7 //as 返回 null 而不會引(yin)發異常 8 9 if (_entity != null) 10 11 { 12 13 /// 代碼(ma)邏輯 14 15 } 16 17 else 18 19 { 20 21 throw new Exception("請傳入UserPointRecord類型的模(mo)型化對(dui)象"); 22 23 } 24 25 }
好了(le),講(jiang)到這里,您是(shi)否對接口有了(le)一(yi)種全(quan)新的認識呢!哈(ha)哈(ha)!