• 基础才是重中之重~为什么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();

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

    如图:

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

    回到目录

  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/lori/p/3066233.html
Copyright © 2020-2023  润新知