c#使用擴展方法,實現對接口的擴展
阿新 • • 發佈:2018-03-06
post 使用 size this new gen gpo 帶來 BE
擴展方法實現對接口擴展
在使用面向對象的語言進行項目開發的過程中,我們會較多的會使用到定義接口、繼承等方式,來減少常用的操作。但是並非所有的場景都適合使用“繼承”特性。
繼承帶來的問題,對象的繼承關系在運行時就已經定義好了,子類的實現與它父類有非常緊密的依賴關系,以至於在修改父類的情況下,會影響到相關繼承父類的子類。
c#3.0擴展方法
- 擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的
- 必須攜帶一個參數,參數指定該方法作用於哪個類型,並且該參數以 this 修飾符為前綴
- 只能是訪問所擴展類的public成員
實例
1 /*定義組裝汽車*/ 2 interface ICar 3 { 4 //定義車身 5 string Frame(); 6 //定義車燈 7 string CarLight(); 8 //定義座椅 9 string Chair(); 10 //定義輪子 11 string Wheel(); 12 //定義方向盤 13 string SteeringWheel(); 14 }
1 public classBenz : ICar 2 { 3 /*繼承父類*/ 4 public string CarLight() 5 { 6 return "安裝奔馳車燈"; 7 } 8 9 public string Chair() 10 { 11 return "安裝奔馳座椅"; 12 } 13 14 public string Frame() 15 { 16 return"設計車身結構"; 17 } 18 19 public string SteeringWheel() 20 { 21 return "安裝奔馳方向盤"; 22 } 23 24 public string Wheel() 25 { 26 return "安裝奔馳輪子"; 27 } 28 }
1 public class Ferrari : ICar 2 { 3 /*繼承父類*/ 4 public string CarLight() 5 { 6 return "安裝法拉利車燈"; 7 } 8 9 public string Chair() 10 { 11 return "安裝法拉利座椅"; 12 } 13 14 public string Frame() 15 { 16 return "設計車身結構"; 17 } 18 19 public string SteeringWheel() 20 { 21 return "安裝法拉利方向盤"; 22 } 23 24 public string Wheel() 25 { 26 return "安裝法拉利輪子"; 27 } 28 }
調用例子
1 private void btnBenz_Click(object sender, EventArgs e) 2 { 3 ICar benz = new Benz(); 4 listBox1.Items.Add("工人1號正在安裝奔馳!"); 5 listBox1.Items.Add(benz.Frame()); 6 listBox1.Items.Add(benz.Wheel()); 7 listBox1.Items.Add(benz.SteeringWheel()); 8 listBox1.Items.Add(benz.Chair()); 9 listBox1.Items.Add(benz.CarLight()); 10 } 11 12 private void btnFerrari_Click(object sender, EventArgs e) 13 { 14 ICar ferrari = new Ferrari(); 15 listBox1.Items.Add("工人2號號正在安裝法拉利!"); 16 listBox1.Items.Add(ferrari.Frame()); 17 listBox1.Items.Add(ferrari.Wheel()); 18 listBox1.Items.Add(ferrari.SteeringWheel()); 19 listBox1.Items.Add(ferrari.Chair()); 20 listBox1.Items.Add(ferrari.CarLight()); 21 }
以上完成一個簡單的子類繼承父類,實現父類定義的接口方法
現在我新安裝一輛大眾CC,並需要加裝一個天窗,這時候我們就需要調整父類,添加天窗的接口定義
1 /*定義組裝汽車*/ 2 interface ICar 3 { 4 //定義車身 5 string Frame(); 6 //定義車燈 7 string CarLight(); 8 //定義座椅 9 string Chair(); 10 //定義輪子 11 string Wheel(); 12 //定義方向盤 13 string SteeringWheel(); 14 15 /*定義新接口,添加天窗*/ 16 string SkyLight(); 17 }
這樣就會產生以下問題,由於我們的Benz和Ferrari不需要天窗,但是又在父類定義了天窗的接口,從而導致Benz和Ferrari,都需要實現天窗的接口,明顯不符合客戶需求,應該怎麽辦?
這時候我們可以是要擴展方法,結合上列擴展方法的概述,我們對結構進行調整
安裝大眾CC
1 public class VolkswagenCC : ICar 2 { 3 /*繼承父類*/ 4 public string CarLight() 5 { 6 return "安裝大眾CC車燈"; 7 } 8 9 public string Chair() 10 { 11 return "安裝大眾CC座椅"; 12 } 13 14 public string Frame() 15 { 16 return "設計車身結構"; 17 } 18 19 public string SteeringWheel() 20 { 21 return "安裝大眾CC方向盤"; 22 } 23 24 public string Wheel() 25 { 26 return "安裝大眾CC輪子"; 27 } 28 }
擴展大眾CC天窗方法
1 public static class CCExtend 2 { 3 public static string SkyLight(this ICar ii) 4 { 5 return "安裝大眾CC天窗"; 6 } 7 }
完成大眾CC天窗安裝
1 private void btnCC_Click(object sender, EventArgs e) 2 { 3 ICar CC = new VolkswagenCC(); 4 listBox1.Items.Add("工人3號正在安裝法拉利!"); 5 listBox1.Items.Add(CC.Frame()); 6 listBox1.Items.Add(CC.Wheel()); 7 listBox1.Items.Add(CC.SteeringWheel()); 8 listBox1.Items.Add(CC.Chair()); 9 listBox1.Items.Add(CC.CarLight()); 10 listBox1.Items.Add(CC.SkyLight()); 11 }
最終實現效果
2018-03-05 23:32:02
c#使用擴展方法,實現對接口的擴展