小議C#接口的隱式與顯示實現


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

 

一、對於繼承類里頭有相同方法時候,用接口方式去調用,會優先查走顯式接口方法

例如

 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

 

總結:接口對象調用方法時候,會去找第一實現接口方法。。。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM