第二十三回 基础才是重中之重~为什么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();
复制代码

而程序运行的结果,应该是我们可以认识到的:

如图:

看完这篇文章,相信大家对“实现接口”有了全新的认识吧,在实际开发中,如果你强调“面向接口编程”,可以每次都“显示实现接口”,这样可以确保你的对象总要为接口进行声明。

posted @ 2013-05-09 10:45  于为  阅读(192)  评论(0编辑  收藏  举报