回到目錄
題目很有意思,在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();
而程式啟動並執行結果,應該是我們可以認識到的:
看完這篇文章,相信大家對“實現介面”有了全新的認識吧,在實際開發中,如果你強調“面向介面編程”,可以每次都“顯示實現介面”,這樣可以確保你的對象總要為介面進行聲明。
回到目錄