第二十三回 基础才是重中之重~为什么C#有显示实现接口
题目很有意思,在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();
而程序运行的结果,应该是我们可以认识到的:
如图:
看完这篇文章,相信大家对“实现接口”有了全新的认识吧,在实际开发中,如果你强调“面向接口编程”,可以每次都“显示实现接口”,这样可以确保你的对象总要为接口进行声明。