c#學習歷程4

內容主要包括兩大主題:接口和委託

一.接口

接口定義:把一組方法聲明進行統一的命名,但是這些方法沒有實現(和純虛函數類似,只聲明方法,不能實例,只能被繼承)

格式:interface 接口名字
  {
    聲明方法
  }

注意:1.接口不需訪問權限,默認爲公有
           2.使用時不能單獨使用,只能被繼承(可由類或結構體實現)
         3.接口沒有字段,運算符重載,實例構造函數,析構函數,只有方法(  屬性 事件  索引器)
           4.接口不能給你使用static關鍵值,方法只能是普通方法不能加static

    interface MyInterface{
    //只能被重寫 不能被調用 類似抽象方法  不需寫訪問權限  默認爲公有
        void print();
    }

    interface Interface
    {
        void print();
    }


繼承接口:如果想繼承接口那麼必須實現接口中定義的所有方法

class MyClass:MyInterface
    {
        
        public void print()
        {
            Console.WriteLine ("MyClass");
        }

     }
多繼承的問題
當多個接口包含相同方法的時候,如果都實現的話,就會發生衝突,系統不知道調用哪一個

解決方法:1.同時實現多個方法(隱式實現) 2.加上對象.來區分開方法(顯式的實現)

1.只寫一個方法實現來實現所有接口的方法
class MyClass:MyInterface,Interface
    {
        // 不加訪問權限  默認爲私有
        //當多個接口有共同的方法時
        //不分開隱式實現(推薦)(2個接口方法  同時實現)
        public void print()
        {
            Console.WriteLine ("MyClass");
        }

2.
class MyClass:MyInterface,Interface
   
//分開的顯示實現(還需要強制類型轉換)不加任何訪問修飾符 默認爲私有
        void MyInterface.print()
        {
            Console.WriteLine ("MyInterface");
        }

        void Interface.print()
        {
            Console.WriteLine ("Interface");
        }

使用顯式接口實現方式時,需要注意幾個問題

1.若顯式實現接口,方法不能使用任何訪問修飾符。

  顯式實現的成員默認爲私有。

2.顯式實現的成員默認是私有的,所以這些成員不能通過對象

  直接訪問。此時正確的訪問方式就是把對象顯式的轉換爲對應的接口,通過接口來調用該方法。

  MyClass mc = new MyClass();

  MyInterface mc1 = (MyInterface)mc;
  mc1.print ();

3.當類實現單個接口時,通常使用隱式接口方式,因爲對象可以直接訪問接口方法。

4.實現多個接口時候,一般推薦使用顯式的方式。 


接口經常與抽象類一起使用,共同服務於面向對象的編程

單分析一下區別: 

1.抽象類使用abstract關鍵字進行定義,接口使用interface進

  行定義,它們都不能實例化

2.抽象類可以包含虛方法、非抽象方法和靜態成員;但接口不

  能包含虛方法和任何靜態成員,並且接口中只能定義方法,不能有具
  體實現。

3.抽象類不能實現多繼承,接口支持多繼承。

4:抽象類本質是一個類;接口只是代表實現類具有接口聲明的方法,是一種CAN—DO關係。 



二.委託

委託就是把一些方法包裝成了一個對象來使用

委託的步驟:1.定義委託類型 2.聲明委託變量 3.實例化委託 4.作爲參數傳遞 5.調用委託

1.有一個方法的委託

class MainClass{

//1:
聲明委託
delegate void MyDelegate(int para1,int para2);

public static void Main (string[] args)

{

  //2:
定義委託變量

  MyDelegate d;

  //3:
實例化委託(添加方法)

  d = new MyDelegate (new MainClass().Add);

  //4:
調用

  MyMethod (d);
  Console.WriteLine ("Hello World!");

}

void Add(int a,int b)

{

  int sum = a + b;

  Console.WriteLine (""+sum);

}

private static void MyMethod(MyDelegate myDelegate)
{
 

  //5:
方法中調用委託

  myDelegate (1,2);

}

}
 

委託的優點:

引入委託之後,我們可以把函數作爲參數傳遞給另外一個方法了。委託可以提高方法擴展性。


 

2.委託鏈

class MainClass
    {
        public delegate void delegateTest();

        private static void method1(){
            Console.WriteLine ("這是靜態方法1");
        }
        private void method2(){
            Console.WriteLine ("這是實例方法2");
        }
        private void method3(){
            Console.WriteLine ("這是實例方法3");
        }
        static void Main(string[] args){
            MainClass p=new MainClass();
            delegateTest d1 = new delegateTest (MainClass.method1);
//          delegateTest d1 = MainClass.method1;//簡寫
            delegateTest d2 = new delegateTest (p.method2);
            delegateTest d3 = p.method3;//簡寫
            delegateTest delechain = null;
            delechain += d1;
            delechain += d2;
            delechain += d3;
            //移除委託
            delechain -= d1;
            delechain ();

特別注意 :  //轉向直接發生改變,直接指向d3
            delechain = d3;//只輸出爲d3的方法
            delechain ();

        }
    }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章