小弟不才,各位大牛嘴下留情。。。
一、对于继承类里头有相同方法时候,用接口方式去调用,会优先查走显式接口方法
例如
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();
二、多重继承又如何呢?
先看个简单例子
//在上面基础上增加多一个类 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
三、再来一个比较坑爹例子分析吧
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
如果非得要实现接口方法
只能显示调用,代码改为
public class Class3 : Class1, IA { void IA.Test() { Console.WriteLine("Class3"); } }
这样子,这个结果输出毫无疑问是 Class3
总结:接口对象调用方法时候,会去找第一实现接口方法。。。