小议C#接口的隐式与显示实现

小弟不才,各位大牛嘴下留情。。。

 

一、对于继承类里头有相同方法时候,用接口方式去调用,会优先查走显式接口方法

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface IA
   {
       void Test();
   }
 
   public class Class1 : IA
   {
 
       public  void Test()
       {
           Console.WriteLine("Class1");
       }
 
       void IA.Test()
       {
           Console.WriteLine("IA.Test");
       }
   }

1、接口对象调用方式

IA c1 = new Class1();
c1.Test();

则输出 IA.Test

 

2、直接调用方式

Class1 c1 = new Class1();
c1.Test();

则输出 Class1

3、推断方式调用 var关键字,编译器自动推断为c1为Class1对象,结果同2

var c1 = new Class1();
c1.Test();

 

二、多重继承又如何呢?

先看个简单例子

1
2
3
4
5
6
7
8
//在上面基础上增加多一个类 
public class Class2 : Class1
    {
        public new void Test()
        {
            Console.WriteLine("Class2");
        }
    }

  

二、以下三种方式调用结果分析得知:接口对象调用方法时候,会去找接口实现接口方法,讲的有点抽象,看一下下面一个小Demo

IA c2 = new Class2();
c2.Test();

输出:IA.Test

 

Class2 c2 = new Class2();
c2.Test();

 

var c2 = new Class2();
c2.Test();

输出都是:Class2

 

三、再来一个比较坑爹例子分析吧

1
2
3
4
5
6
7
public class Class3 : Class1, IA
   {
       void Test()
       {
           Console.WriteLine("Class3");
       }
   }

当我们写上这段代码,编译会给我一个警告

警告 1 “ConsoleApplication1.Class3.Test()”隐藏了继承的成员“ConsoleApplication1.Class1.Test()”。如果是有意隐藏,请使用关键字 new。 E:\测试Demo代码\接口继承\ConsoleApplication1\ConsoleApplication1\Program.cs 55 14 ConsoleApplication1

 

从编译器给我提示来看,Test() 并没有实现接口方法 

 

IA c3 = new Class3();
c3.Test();

 

Class3 c3 = new Class3();
c3.Test();

 

var c3 = new Class3();
c3.Test();

 

三种方法结果都是 :IA.Test

 

如果非得要实现接口方法

只能显示调用,代码改为

1
2
3
4
5
6
7
public class Class3 : Class1, IA
    {
        void IA.Test()
        {
            Console.WriteLine("Class3");
        }
    }

这样子,这个结果输出毫无疑问是 Class3

 

总结:接口对象调用方法时候,会去找第一实现接口方法。。。

 

 

 

posted @   walleyekneel  阅读(2018)  评论(11编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示