題目很有意思,在C#世界里,有一種實現叫做“顯示實現”,它說的其實是對接口的實現方式,一般地,我們用到的實現都是隱示實現(VS里叫做實現接口)

為什么我們沒有用過“顯示實現接口”呢?當類只繼承一個接口時,顯式實現接口與實現接口(我習慣稱它為隱示實現)沒有區別,如果你非要找個區別,那就是顯示接口后,所有接口方法都必須是public,而“顯示實現接口“則對類來說不是public,如果你需要用到接口方法時,在聲明對象時,必須使用接口作聲明,而如果使用“隱示實現接口”,則使用類或者接口作聲明都是可以的。
例如:
顯示實現接口,只能使用接口作聲明,如果使用類作聲明,那么接口中的方法由於在類中不是public,所以對外界是不可見的

隱示實現接口,可以使用類或者接口進行對象聲明

書規正傳,說說為什么C#有顯示實現接口吧,其實在於JAVA來說,它並不提供顯示實現接口,而且JAVA在面向對象上還有很多無法與C#相比的地方,大家隨着自己對知識的深入,會更有體會,千萬不要聽JAVA人的一面之詞。
對於一個接口來說,它被認識是一種行為規范,例如,一個中國人與美國人的行為規范,它可能有一個相同的方法叫Compute_Wage,即“計算工資”,它在對人(people)的實現上是不同的,因為在美國,人們的福利會更好一些,而在中國,苦B的人們要交各種稅收,無語!
代碼就如下:
/// <summary> /// 在美國 /// </summary> interface IUsaAccount { /// <summary> /// 計算工資 /// </summary> void Compute_Wage(); } /// <summary> /// 在中國 /// </summary> interface IChinaAccount { /// <summary> /// 計算工資 /// </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("統一了,{0}它無論在哪個國家,工資都是{1}", Name, Salary); } #endregion #region 顯示實現接口 #region IUsaAccount 成員 void IUsaAccount.Compute_Wage() { Console.WriteLine("在美國,{0}的工資是(原工資{1}*12%的福利){2}", Name, Salary, Salary * 1.2m); } #endregion #region IChinaAccount 成員 void IChinaAccount.Compute_Wage() { Console.WriteLine("在中國,{0}的工資是(原工資{1}-原工資{1}*2%的個稅){2}", Name, Salary, Salary - Salary * 0.02m); } #endregion #endregion }
而這時,一個People對象,將會有三個Compute_Wage方法,它們根據你的People對象聲明不同,有三種不同的情況,看一下聲明對象的代碼:
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();
而程序運行的結果,應該是我們可以認識到的:
如圖:
看完這篇文章,相信大家對“實現接口”有了全新的認識吧,在實際開發中,如果你強調“面向接口編程”,可以每次都“顯示實現接口”,這樣可以確保你的對象總要為接口進行聲明。
