1. 程式人生 > >c#使用擴展方法,實現對接口的擴展

c#使用擴展方法,實現對接口的擴展

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 class
Benz : 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#使用擴展方法,實現對接口的擴展