小弟不才,各位大牛嘴下留情。。。
一、对于继承类里头有相同方法时候,用接口方式去调用,会优先查走显式接口方法
例如
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
总结:接口对象调用方法时候,会去找接口实现接口方法。。。
小议C# 接口的隐式与显示实现,布布扣,bubuko.com
原文:http://www.cnblogs.com/walleyekneel/p/3581489.html