【框架設計】什么是框架的接口


   什么是框架的接口

概述:   接口,對於大家都不陌生,至於何時使用,怎么使用?這里舉一個例子:假如一個類A,負責傳輸數據。而類B,恰好是接收數據。我們還需要一個類C用來接收和傳輸數據。那么怎么樣讓A類和B類繼承C呢?有的編程語言,允許多繼承。子類可以繼承多個父類。但是在C#中,定義不能多繼承,但是可以使用多個接口。那么要繼承接口就需要interface定義它ID,內部可以封裝方法,但是注意,倘若你要繼承ID接口,那么接口內部的所有方法屬性都要實現。說到此處,不免有人問:“接口和父類繼承有何區別?”.一般是泛類中的個體,即is--a的關系使用繼承。如:狗是動物的一種可以使用,Class 狗:動物而接口強調是對象具有某種能力,即can--do的關系使用接口。如:大雁會飛,Class 大雁:I飛C#定義子類不許繼承多個類,但是可以多個接口。如:唐老鴨是動物,它會說話,會游泳,Class 唐老鴨:動物,I說話,I游泳

C#基礎系列導航


  1. C#實現隊列讀寫操作(一)
  2. 變化多端的列表(二)
  3. VS自動內存管理(垃圾回收集)(三)
  4. C#忽略基礎知識點梳理(四)
  5. 什么是框架的接口(五)
  6. 程序集的加載與反射(六)
  7. CLR寄宿和應用程序域(七)
  8. 異常(八)

類和接口繼承問題:

      System.Object類是所有類的根類,它定義的四個方法:ToString,Equals,CetHashCode,GetType適用於任何類。所有繼承Object類的類實際繼承的是方法簽名base()和具體實現。

      接口:實際上是為一組方法簽名,指定一個方法名,不加以方法的實現。可以被多個類來繼承,可以定義事件,方法,參數/無參屬性。不許定義構造器方法和實例字段。提供接口必須實行所有接口中的方法。具有can--do的關系。

CLR要求接口方法標記Virtual。這樣才能被派生類重寫。如果不標記,默認Virtual和Sealed,阻止派生類重寫方法接口。

 

接口方法隱式和顯示實現:實例解析

接口:

internal sealed class SimpleType : IDisposable { //接口方法的隱式實現
       public void Dispose() { Console.WriteLine("隱式 Dispoable"); } //接口方法的顯式實現
       void IDisposable.Dispose() { Console.WriteLine("顯式 Dispoable"); } }

實現:

static void Main(string[] args) { SimpleType st = new SimpleType(); st.Dispose(); IDisposable d = st; d.Dispose(); Console.ReadLine(); }

結果:


泛型接口問題:

IComparable<T>有一下幾個好處:

1,編譯時安全,可以有任意類型,若有異常通過Object類拋出。

2,操作值類型時候,不需要太多裝箱,也正是比非泛型接口優化之處。性能提高。

3,可以根據參數T不同使用同一個接口若干次。代碼冗雜性小,可讀性高。性能提升。


對基類和接口操作的實例運用:

      描述:有一個動物類,它可以派生出多個類。並且其中一個類既要實現繼承又要實現接口。在控制台程序編寫並輸出此派生類的所有方法。

基類派生多個類,並且其中一類繼承接口

    //基類
    public abstract   class Base
    {
        public abstract void Animal();
    }
    //派生類,繼承基類和接口
    public  class  Brid:Base,Interface1
    {
        public override void Animal()
        {
            Console.WriteLine("我是大雁!");
        }
        public void Fly()
        {
            Console.WriteLine("我會飛!");
        }
        public void Say()
        {
            Console.WriteLine("我會說話!");
        }
        
    }
    //派生類
    public class Brid1 : Base
    {
        public override void Animal()
        {
            Console.WriteLine("我是笨笨鳥!");
        }
    }

  

接口的定義

     interface Interface1
    {
         void Fly();
         void Say(); 
    }

  

客戶端調用:

        static void Main(string[] args)
        {
            Brid b1 = new Brid();
            b1.Animal();
            Interface1 d = b1;
            d.Fly();
            d.Say();
            Console.ReadKey();
         }

  

輸出結果

 

補充:抽象類和接口多態關系實例

     之前對接口做了總結,應園友需求,今天總結一下接口和抽象類的基礎知識,用小的例子演示更容易理解。在演示之前我們還是把原理核心的區別了解下

相同點:

接口和抽象類都可以由子類繼承的抽象成員(就是可以聲明定義方法等但是不負責具體實現),接口和抽象類都不能實例化。

不同點:

接口所擁有的成員都是抽象成員,而抽象類既可以有抽象成員也可以有非抽象成員。(下面例子中,抽象類定義抽象方法和一般非抽象方法演示)

抽象類可以public和internal,但是接口一般都是public的

抽象類包含構造函數,析構函數,靜態成員和常量,恰恰接口不能包含這些。

類或者抽象類只能單繼承,接口可以多繼承


下面描述實例的思想流程:

      什么是抽象類呢?我開始想到對象是動物,后來發現動物實例大家比較熟悉。就改變門門對象即抽象類。抽象類里面有什么?我想有個抽象方法,這個跟接口一樣。就在找個不一樣的構造方法,還要一個抽象屬性。抽象類完成了。下面繼承的子類就應該是具體的了,門有很多種,我選擇木門。木門中擁有抽象屬性和方法的重載(就是具體屬性和方法實現)。

這時候門可能還有玻璃門,鐵門,金門等。這樣就可以多個子類(不同材料門)繼承父類(門),這就是傳說的多態。下面缺接口,什么接口?之前我就說是can--do關系。我定義一個鎖的接口,也可以有門鈴接口。我把門鈴放在鎖類吧。聽到門鈴去開鎖(開門)。這樣讓子類(各種材料門)繼承門和鎖。實現了子類繼承接口和父類。多個這樣類實現多態。

然后,客戶端實例化兩種方法。一種對子類實例(這樣實例接口時候可以將子類對象附給接口),也可以實例父類(new 子類)。

綜述:

        就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承);一個門可以有鎖(接口)也可以有門鈴(多實現)。

 


接口源碼:

    public interface Isuo//I鎖
    {
        void MenLing();//門鈴
    }

 抽象類實現繼承和多態:

public abstract class 門
    {
        protected string name;
        //抽象屬性
        public abstract string Name
        {
            get;
        }
        //抽象方法
        public abstract void Open();
        //一般方法
        public void Price()
        {
            Console.WriteLine("我的門,價格好高!");
        }
    }

    

    //繼承和多態
    public class 木門 : 門, Isuo
    {
        public 木門(string myname)  
        {   
            name = myname;
        } 
        
        //重載抽象屬性    
        public override string Name
        {
            get { return name; }
        }
        //重載抽象方法 
        public override void Open()
        {
            Console.WriteLine(name + " 是最經濟在!");
        }   
        //實現接口方法 

        public void MenLing()
        {
            Console.WriteLine("我是木門的門鈴!");
        }
    }

    public class 鐵門 : 門, Isuo
    {
        public 鐵門(string myname)
        {
            name = myname;
        }

        //重載抽象屬性    
        public override string Name
        {
            get { return name; }
        }
        //重載抽象方法 
        public override void Open()
        {
            Console.WriteLine(name + " 是結實的!");
        }
        //實現接口方法   
        public void MenLing()
        {
            Console.WriteLine("我是鐵門的門鈴!");
        }
    }

客戶端實現

static void Main(string[] args)
        {
            木門 men = new 木門("木門");
            men.Open();
            men.Price();
            門 men1 = new 木門("鐵門");
            men1.Open();
            men1.Price();

            Isuo s = men;
            s.MenLing();
            Console.Read();
        }

 運行結果:

 


總結:

      到此接口基本定義和方法已經結束,以及使用的定義。接口多是起着內部方法的作用,有不同於類。在編程中會給你帶來更多的便利和驚喜。

 


免責聲明!

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



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