不忘本~接口
接口無疑是面向對象的程序設計中最重要的概念之一,它體現一種抽象,一種規范;即它只規定了具體的操作,而不對操作進行實現,它的實現由繼承它的類去完成;它是一種規范,即,它要求實現它的類要對它的成員完全實現才行.
看一段代碼:
1 /// <summary> 2 3 /// 武器攻擊的通用接口 4 5 /// </summary> 6 7 public interface IAttack 8 9 { 10 11 /// <summary> 12 13 /// 攻擊方法,被攻擊對象是一個敵人對象 14 15 /// </summary> 16 17 /// <param name="Enemy"></param> 18 19 VCommons.VMessage Attack(Entity.Enemy Enemy); 20 21 }
對接口進行實現,看代碼:
1 /// <summary> 2 3 /// 木頭攻擊 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 /// 鐵棒攻擊 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 }
除了上面的接口之外,還有一種特殊的接口,它內部沒有任何元素,我們稱為標記接口。它不是為了調用者的期待而定義,其意圖是抽象,將那些不能抽象在一起的類,利用一個標記綁定起來,為其提供統一的接口。標記接口保證了調用方法的一致性。雖然強制類型轉換會引入具體依賴,卻不會有任何副作用,因為在方法實現中,設計者的期待本身就是要轉換的類型.
看代碼:(對象實現統一接口和對象具體實體類)
1 /// <summary> 2 3 /// 數據庫對象統一協調接口 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 /// 所有人ID 44 45 /// </summary> 46 47 public String UserID { get; set; } 48 49 50 51 /// <summary> 52 53 /// 值 54 55 /// </summary> 56 57 public Int32 Value { get; set; } 58 59 60 61 /// <summary> 62 63 /// 收支類型 [資金流向],0-收入,1-支出 64 65 /// </summary> 66 67 public Entity.FlowType FlowType { get; set; } 68 69 70 71 /// <summary> 72 73 /// 備注 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 /// 活躍值明細類類型 [默認為1, 為了以后做擴展使用] 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 //構造函數 116 117 #region constructed function 118 119 120 121 /// <summary> 122 123 /// 新建立的時候構造函數 124 125 /// </summary> 126 127 public ActiveRecord() 128 129 { 130 131 132 133 } 134 135 136 137 /// <summary> 138 139 /// 新建立的時候構造函數 140 141 /// </summary> 142 143 /// <param name="_ActiveRecordID">活躍值明細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 }
而在操作統一接口調用實體時,我們可以直接寫成接口類,而不用寫用具體類型
1 /// <summary> 2 3 /// 通用數據庫訪問接口 4 5 /// </summary> 6 7 public interface IRepository 8 9 { 10 11 /// <summary> 12 13 /// 根據數據庫實體—》更新記錄 14 15 /// </summary> 16 17 /// <param name="entity"></param> 18 19 void Update(IDataEntity entity); 20 21 }
注意,在實現時,我們需要將接口對象進行強類型轉換,這在標記接口中是可以的.
1 public void Update(Entity.IDataEntity entity) 2 3 { 4 5 Entity.UserPointRecord _entity = entity as Entity.UserPointRecord; 6 7 //as 返回 null 而不會引發異常 8 9 if (_entity != null) 10 11 { 12 13 /// 代碼邏輯 14 15 } 16 17 else 18 19 { 20 21 throw new Exception("請傳入UserPointRecord類型的模型化對象"); 22 23 } 24 25 }
好了,講到這里,您是否對接口有了一種全新的認識呢!哈哈!
浙公網安備 33010602011771號