基礎才是重中之重~為(wei)什么C#有顯示實現接口(kou)
題(ti)目很有(you)意(yi)思,在(zai)C#世界(jie)里,有(you)一種實現叫做“顯示實現”,它(ta)說(shuo)的其實是(shi)對接(jie)(jie)口(kou)的實現方式,一般地,我(wo)們用到的實現都(dou)是(shi)隱示實現(VS里叫做實現接(jie)(jie)口(kou))
為(wei)(wei)什么我們沒(mei)(mei)有用(yong)(yong)過“顯(xian)(xian)示實現接(jie)(jie)口(kou)(kou)(kou)(kou)”呢?當類(lei)(lei)只繼(ji)承一(yi)個接(jie)(jie)口(kou)(kou)(kou)(kou)時(shi)(shi),顯(xian)(xian)式實現接(jie)(jie)口(kou)(kou)(kou)(kou)與實現接(jie)(jie)口(kou)(kou)(kou)(kou)(我習慣(guan)稱它為(wei)(wei)隱示實現)沒(mei)(mei)有區別(bie),如(ru)果你(ni)非(fei)要找(zhao)個區別(bie),那就是(shi)顯(xian)(xian)示接(jie)(jie)口(kou)(kou)(kou)(kou)后,所有接(jie)(jie)口(kou)(kou)(kou)(kou)方法都(dou)必須(xu)是(shi)public,而“顯(xian)(xian)示實現接(jie)(jie)口(kou)(kou)(kou)(kou)“則對類(lei)(lei)來說(shuo)不是(shi)public,如(ru)果你(ni)需(xu)要用(yong)(yong)到接(jie)(jie)口(kou)(kou)(kou)(kou)方法時(shi)(shi),在聲(sheng)(sheng)明(ming)對象時(shi)(shi),必須(xu)使用(yong)(yong)接(jie)(jie)口(kou)(kou)(kou)(kou)作(zuo)(zuo)聲(sheng)(sheng)明(ming),而如(ru)果使用(yong)(yong)“隱示實現接(jie)(jie)口(kou)(kou)(kou)(kou)”,則使用(yong)(yong)類(lei)(lei)或者接(jie)(jie)口(kou)(kou)(kou)(kou)作(zuo)(zuo)聲(sheng)(sheng)明(ming)都(dou)是(shi)可以的。
例如:
顯示實現接口,只能使用接口作聲明,如果使用類作聲明,那么接口中的方法由于在類中不是public,所以對外界是不可見的
隱示實現接口,可以使用類或者接口進行對象聲明
書規正傳,說說為(wei)什(shen)么C#有顯示實現接(jie)口吧,其實(shi)在于(yu)JAVA來(lai)說,它(ta)并不(bu)提供顯(xian)示實(shi)現接(jie)口,而且(qie)JAVA在面向對象上還有(you)很多無法(fa)與C#相(xiang)比的(de)地方,大家隨著自(zi)己對知識的(de)深(shen)入,會更(geng)有(you)體會,千萬(wan)不(bu)要聽JAVA人(ren)的(de)一面之詞。
對(dui)于一(yi)個接口來說,它被(bei)認識是(shi)一(yi)種(zhong)行為規范,例如,一(yi)個中國(guo)人與美(mei)國(guo)人的(de)行為規范,它可(ke)能有一(yi)個相同(tong)的(de)方法叫(jiao)Compute_Wage,即“計算工(gong)資”,它在(zai)對(dui)人(people)的(de)實現上是(shi)不同(tong)的(de),因為在(zai)美(mei)國(guo),人們的(de)福利會更好(hao)一(yi)些(xie),而(er)在(zai)中國(guo),苦B的(de)人們要交各種(zhong)稅收(shou),無語!
代碼就如下:
/// <summary> /// 在美國 /// </summary> interface IUsaAccount { /// <summary> /// 計算工資 /// </summary> void Compute_Wage(); } /// <summary> /// 在中國 /// </summary> interface IChinaAccount { /// <summary> /// 計(ji)算工(gong)資(zi) /// </summary> void Compute_Wage(); }
而對于一個People來說,它無所語是中國人還是美國人,總之我要去實現你的方法,中國人實現中國的規約,美國人實現美國的規約,當然,如果你沒有指定是中
國人還是美國人,那我就是統一的規約。
代碼就如下了:
/// <summary> /// 苦B人類 /// </summary> public class People : IUsaAccount, IChinaAccount { public People(string name, decimal salary) { this.Name = name; this.Salary = salary; } #region Properties public string Name { get; set; } public decimal Salary { get; set; } #endregion #region 隱示實現接口 public void Compute_Wage() { Console.WriteLine("統一(yi)了(le),{0}它(ta)無論在哪個國家,工資都是{1}", Name, Salary); } #endregion #region 顯示實現接口 #region IUsaAccount 成員 void IUsaAccount.Compute_Wage() { Console.WriteLine("在美國,{0}的(de)工資(zi)(zi)是(原工資(zi)(zi){1}*12%的(de)福利){2}", Name, Salary, Salary * 1.2m); } #endregion #region IChinaAccount 成員 void IChinaAccount.Compute_Wage() { Console.WriteLine("在(zai)中國,{0}的工資是(原(yuan)工資{1}-原(yuan)工資{1}*2%的個(ge)稅(shui)){2}", Name, Salary, Salary - Salary * 0.02m); } #endregion #endregion }
而這時,一個People對象,將會有三個Compute_Wage方法,它們根據你的People對象(xiang)聲明(ming)不同,有三種(zhong)不同的情況(kuang),看一(yi)下聲明(ming)對象(xiang)的代碼:
IUsaAccount person1 = new People("zzl", 5000); person1.Compute_Wage(); IChinaAccount person2 = new People("zzl", 5000); person2.Compute_Wage(); People person3 = new People("zzl", 5000); person3.Compute_Wage();
而程序運行(xing)的結果(guo),應該是我們可以(yi)認(ren)識到的:
如圖:
看完這篇文章,相信大家對“實現接口”有了全新的認識吧,在實際開發中,如果你強調“面向接口編程”,可以每次都“顯示實現接口”,這樣可以確保你的對象總要為接口進行聲明。