• 为什么C#有显示实现接口


    j简而言之就是当面对多个接口继承时,可实现不同接口的逻辑处理。

    题目很有意思,在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();

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

    如图:

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

  • 相关阅读:
    Trie字典树
    NET Web API和Web API Client Gen使Angular 2应用程序
    MyBatis实体属性与表的字段不对应的解决方案
    携程Apollo(阿波罗)配置中心使用Google代码风格文件(在Eclipse使用Google代码风格)(配合阿里巴巴代码规约快速设置)
    Spring Boot实现多个数据源教程收集(待实践)
    携程Apollo(阿波罗)配置中心用户管理和部门管理
    Spring Boot多数据源连接8小时后断开的问题解决(MySQL)
    携程Apollo(阿波罗)配置中心本地开发模式不接入配置中心进行本地开发
    携程Apollo(阿波罗)配置中心把现有项目的配置文件迁移到Apollo
    携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成
  • 原文地址:https://www.cnblogs.com/Darren-xia/p/14053747.html
Copyright © 2020-2023  润新知