C#接口

 
         接口把一組公共方法和屬性組合起來 ,以封裝特定功能的一個集合。通過類可以實現接口,這樣類就支持接口所有的屬性和方法。
        接口只能對方法和屬性進行定義,不能實現,只能由支持它的類實現。接口中的成員不能用訪問符修飾,如public,private,它的成員默認爲public
        定義接口比較簡 單
        public interface IMyinterface
        {
            void Dosomething();//方法成員
          int MyAttribute//屬性成員
        {
                get;//這裏只能定義這個屬性是否爲只讀
                set;
            }
        }
       接口和抽象類比較相似,但一個類只能派生於一個抽象類,不過可以實現N個接口。


        舉個例子來說明一下。
        有兩個抽象類,car和train,,汽車和火車
        下面還有許多類,比如公交車,卡車等都派生於汽車
        客車,貨車都派生於火車
        在car,train中公別定義了汽車與火車的一 些主要特性。
        自然的,它們的派生類就擁有這樣的特性,
        但是汽車下的公交車,火車下的客車都可以乘載客人,所以這兩個類可以共同實現一個擁有乘載客人功能的接口,而卡車與貨車可以共同實現一個擁有運載貨物的接口。


        一個類支持一個接品,就必須實現它所有的成員
 interface IMyinterface
 {
  void Dosomething();
  void Doelsething();
 }
    class Myclass1 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("1");
        }
       
    }
    class Myclass2 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("2");
        }
    }

 


上面定義了一個接口IMyinterface,  Myclass實現了這個接口, 這樣,派生於Myclass的類Myclass2也就默認的支持這個接口,也繼承了對方法的實現,在Myclass2中,還可以對Doelsething方法進行重寫。
但這是有前提的。那就是Doelsething方法是由Myclass類隱式實現的。隱式實現只須匹配方法返回值和方法簽名即可。這樣的方 法,可以使用關健字vritual  和 abstract來修飾,而且可以用類的實例類調用                                             
class obj=new Myclass();
obj.Doelsethiing();

而第一個方法Dosomething是顯式執行的。它只能由接口的引用變量來調用。而且派生類不會繼承這個方法的實現,所以上面的Myclass2類也要再加一個這個方法的實現 ,因爲它繼承了Myclass,就默 認的支持這個接口。
 

那接口有什麼作用呢?

如下例:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    interface IMyinterface
    {
        void Dosomething();
    }
    class Myclass1 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("1");
        }
       
    }
    class Myclass2 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("2");
        }
    }

    class Program
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="im1"></param>   注意:此參數爲接口類型,但繼承此接口的類的實例都可以作爲參數傳遞
        private static  void WriteLine1(IMyinterface im1)
        {
            im1.Dosomething();


        }

        static void Main(string[] args)
        {
            Myclass1 mc1 = new Myclass1();
            WriteLine1(mc1); // Myclass1的實例可以作爲參數
            Myclass2 mc2 = new Myclass2();
            WriteLine1(mc2); // Myclass2的實例也可以作爲參數,而不必重載WriteLine1方法
            Console.Read();
          
        }
    }
  
}

由上例可看出,接口作爲參數時,不必重載方法.

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