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

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

如图:

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

本文转自博客园张占岭(仓储大叔)的博客,原文链接:基础才是重中之重~为什么C#有显示实现接口,如需转载请自行联系原博主。

目录
相关文章
|
1月前
|
IDE C# 开发工具
C#系列之接口介绍
C#系列之接口介绍
|
3月前
|
达摩院 Linux API
阿里达摩院MindOpt求解器V1.1新增C#接口
阿里达摩院MindOpt求解器发布最新版本V1.1,增加了C#相关API和文档。优化求解器产品是求解优化问题的专业计算软件,可广泛各个行业。阿里达摩院从2019年投入自研MindOpt优化求解器,截止目前经历27个版本的迭代,取得了多项国内和国际第一的成绩。就在上个月,2023年12月,在工信部产业发展促进中心等单位主办的首届能源电子产业创新大赛上,MindOpt获得电力用国产求解器第一名。本文将为C#开发者讲述如何下载安装MindOpt和C#案例源代码。
140 3
阿里达摩院MindOpt求解器V1.1新增C#接口
|
3月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
3月前
|
安全 C# 开发者
C#中的默认接口方法:接口演化的新篇章
【1月更文挑战第11天】本文探讨了C# 8.0中引入的默认接口方法,这一特性允许在接口中定义具有默认实现的方法。文章介绍了默认接口方法的语法、使用场景,以及它们如何影响接口的设计和实现,同时讨论了默认接口方法带来的好处和潜在的陷阱。
|
7月前
|
设计模式 自然语言处理 C#
C#OOP之八 继承 接口和抽象类
C#OOP之八 继承 接口和抽象类
27 0
|
3月前
|
C# 开发者 索引
C# 11.0中的所需成员:强化接口与抽象类的约束
【1月更文挑战第24天】C# 11.0引入了所需成员(Required members)的概念,这一新特性允许在接口和抽象类中定义必须被实现的成员,包括方法、属性、索引器和事件。通过所需成员,C# 强化了对接口实现和抽象类继承的约束,提高了代码的一致性和可维护性。本文将详细探讨C# 11.0中所需成员的工作原理、使用场景及其对现有编程模式的影响。
|
9月前
|
C#
C# 接口
C# 接口
43 0
|
4月前
|
程序员 C#
C# 类实现接口(Interface) 多态 多继承
C# 类实现接口(Interface) 多态 多继承
|
6月前
|
算法 C# C++
托管C++实现C#接口崩溃的一种情况
托管C++实现C#接口崩溃的一种情况
|
6月前
|
Oracle 关系型数据库 API
C# LIS检验系统源码,接口技术:RESTful API + Http+WCF
LIS检验系统一种专门用于医院化验室的计算机系统,它致力于提高医院化验室的工作效率和检测准确率。LIS系统由多个子系统组成,包括样本管理系统、质控系统、检验结果管理系统、报告管理系统等。体系结构:Client/Server架构 SaaS模式 客户端:WPF+Windows Forms 服务端:C# +.Net 数据库:Oracle 接口技术:RESTful API + Http+WCF