小弟不才,各位大牛嘴下留情。。。
一、對於繼承類里頭有相同方法時候,用接口方式去調用,會優先查走顯式接口方法
例如
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
總結:接口對象調用方法時候,會去找第一實現接口方法。。。
