基礎拾遺------接口詳解

基礎拾遺:

基礎拾遺------特性詳解html

基礎拾遺------webservice詳解web

基礎拾遺------redis詳解redis

基礎拾遺------反射詳解數據結構

基礎拾遺------委託詳解ide

基礎拾遺------接口詳解函數

基礎拾遺------泛型詳解工具

基礎拾遺-----依賴注入spa

基礎拾遺-----數據註解與驗證設計

基礎拾遺-----mongoDB操做code

基礎拾遺----RabbitMQ

  接口定義了全部類繼承接口時應遵循的契約。接口定義了 "要什麼" ,派生類定義了 "怎麼給" 。

 引用CLR VIA C#(類和接口繼承

  在Microsoft.Net Framwork中,有一個名爲System.Object的類,它定義了4個公共實例方法:ToString, Equals, GetHashCode和GetType。該類是其餘全部類的根或者說最終基類。換言之,全部類都繼承了Object的4個實例方法。這還意味着能操做 Object類的實例的代碼實際能操做任何類的實例。
  在CLR中,任何類都確定從一個類也只能從一個類(並且只能從Objetc派生的類)派生的。這個類稱爲基類。基類提供了一組方法簽名和這些方法的實現。你定義的新類可在未來由其它開發人員用做基類——全部方法簽名和方法實現都會由新的派生類繼承。
  CLR容許開發人員定義接口,它實際只是對一組方法簽名進行了統一的命名。這些方法沒有提供任何實現。類經過指定接口與名稱來實現這個接口,它必須顯式提供接口方法的實現,不然CLR會認爲此類型定義無效。
  類繼承有一個重要特色,凡是能使用基類型實例的地方,都能使用派生類型的實例。相似的,凡是能使用具備接口類型實例的地方,都能使用實現了這個接口的一個類型的實例。

1.接口的特性

  1.1.接口是一個引用類型,經過接口能夠實現多重繼承。

  1.2.接口成員是自動公開的(public),且不能包含任何訪問修飾符(public、protected、internal、private),不然 編譯器會報錯。

  1.3.接口相似於抽象基類,不能直接實例化接口;接口中的方法都是抽象方法,實現接口的任何非抽象類型都必須實現接口的全部成員:

    當顯式實現該接口的成員時,實現的成員不能經過類實例訪問,只能經過接口實例訪問。

    當隱式實現該接口的成員時,實現的成員能夠經過類實例訪問,也能夠經過接口實例訪問,可是實現的成員必須是公有的。

  1.4.接口不能包含常量、字段、運算符、實例構造函數、析構函數或類型、不能包含靜態成員,只能包含方法、屬性、事件、索引等成員。

  1.5.接口成員不能有static、abstract、override、virtual修飾符,使用new修飾符不會報錯,但會給出警告說不須要關鍵字new。

  1.6.在聲明接口成員的時候,不許爲接口成員編寫具體的可執行代碼,也就是說,只要在對接口進行聲明時指明接口的成員名稱和參數就能夠了。

2.接口與抽象類

2.1下面讓咱們來對接口與抽象類作個對比。若有不一樣意見歡迎討論。

 

interface

abstract class

實例化

不能夠

不能夠

派生類實現

必須實現全部契約

實現沒實現的方法

 繼承

接口支持多繼承

必須抽象類不能實現多繼承

 抽象

接口只能定義抽象規則

抽象類既能夠定義規則,還可能提供已實現的成員。但不能使用new關鍵字,也不能被密封,緣由是抽象類不能被實例化

 概念

接口是一組行爲規範

抽象類是一個不徹底的類

 回調

接口能夠用於支持回調

抽象類不能實現回調,由於繼承不支持

 成員

接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法

抽象類能夠定義字段、屬性、包含有實現的方法

 數據類型

接口能夠做用於值類型和引用類型。例如,Struct就能夠繼承接口,而不能繼承類

抽象類只能做用於引用類型

構造方法

沒有構造方法

有構造方法

靜態方法

沒有靜態方法(默認public static final類型)

包含靜態方法

修飾符

默認public沒有其餘修飾符。

能夠是public,protected

 2.2.抽象類和接口的使用:

2.2.1. 若是預計要建立組件的多個版本,則建立抽象類。抽象類提供簡單的方法來控制組件版本;

2.2.2.若是建立的功能將在大範圍的全異對象間使用,則使用接口。若是要設計小而簡練的功能塊,則使用接口;

2.2.3.若是要設計大的功能單元,則使用抽象類.若是要在組件的全部實現間提供通用的已實現功能,則使用抽象類; 

2.2.4.抽象類主要用於關係密切的對象;而接口適合爲不相關的類提供通用功能。

3.接口聲明

  3.1.接口使用 interface 關鍵字聲明,它與類的聲明相似。接口聲明默認是 public 的;

  3.2.根據約定,接口類型名稱要以大寫字母I開頭;

public interface ITransactions
{
   // 接口成員
   void showTransaction();
   double getAmount();
}

注:3.3.對CLR而言,定義接口就像定義類型,也就是說,CLR會爲接口類型對象定義一個內部數據結構,同時可用反射機制來查詢接口類型的功能。

  3.4.爲何不能指定接口中方法的修飾符?

    接口中的方法用來定義對象之間通訊的契約,指定接口中的方法爲私有或保護沒有意義。它們默認爲公有方法。

4.接口的實現

  C#中的接口提供了一種實現運行時的多態。

 4.1.案例

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

namespace InterfaceApplication
{

   public interface ITransactions
   {
      // 接口成員
      void showTransaction();
      double getAmount();
   }
   public class Transaction : ITransactions
   {
      private string tCode;
      private string date;
      private double amount;
      public Transaction()
      {
         tCode = " ";
         date = " ";
         amount = 0.0;
      }
      public Transaction(string c, string d, double a)
      {
         tCode = c;
         date = d;
         amount = a;
      }
      public double getAmount()
      {
         return amount;
      }
      public void showTransaction()
      {
         Console.WriteLine("Transaction: {0}", tCode);
         Console.WriteLine("Date: {0}", date);
         Console.WriteLine("Amount: {0}", getAmount());

      }

   }
   class Tester
   {
      static void Main(string[] args)
      {
         Transaction t1 = new Transaction("001", "8/10/2012", 78900.00);
         Transaction t2 = new Transaction("002", "9/10/2012", 451900.00);
         t1.showTransaction();
         t2.showTransaction();
         Console.ReadKey();
      }
   }
}

  當上面的代碼被編譯和執行時,它會產生下列結果:

Transaction: 001
Date: 8/10/2012
Amount: 78900
Transaction: 002
Date: 9/10/2012
Amount: 451900

  4.2接口的隱式實現與顯示實現

  4.2.1隱式實現

  interface IAnimal
    {
       void Dog();
    }
    class Animal:IAnimal
    {
      public void Dog()
      {
       //#
      }
     }
    //經過類調用
    Animal animal = new Animal();
    animal.Dog();
    //或者經過接口調用
    IAnimal animal = new Animal();
    animal.Dog();

以上:類與接口都能調用的爲隱式實現。

  4.2.2.顯示實現

interface IAnimal
  {
    void Dog();
  }
  class Animal:IAnimal
  {
    void IAnimal.Dog()
    {
      //#
    }
  }
IAnimal animal = new Animal();
animal.Dog();
Animal animal = new Animal();
(animal as IAnimal).Dog();

以上:用類的方法調用須要強制轉換的實現爲顯示實現。

是否是感受顯示實現多餘項目中也歷來未曾遇到過???

  4.3.接口隱式實現,顯示實現的場景

    4.3.1.當類實現一個接口時,一般使用隱式接口實現,這樣能夠方便的訪問接口方法和類自身具備的方法和屬性。

    4.3.2.當類實現多個接口時,而且接口中包含相同的方法簽名,此時使用顯式接口實現。即便沒有相同的方法簽名,仍推薦使用顯式接口,由於能夠標識出哪一個方法屬於哪一個接口。

    4.3.3隱式接口實現,類和接口均可訪問接口中方法。顯式接口實現,只能經過接口訪問。

5.接口的繼承

 5.1.接口繼承和類繼承不一樣:

    5.1.1.類繼承不只是說明繼承,並且也是實現繼承;而接口繼承只是說明繼承。

    5.1.2.C#中類繼承只容許單繼承,可是接口繼承容許多繼承,一個子接口能夠有多個父接口(用","分割)。

  5.2.接口的繼承也造成接口之間的層次結構

 interface IProgram
    {
        void Fun();
    }
    interface IAProgram:IProgram
    {
        
    }
    class Program :  IAProgram
    {
        void IProgram.Fun()
        {
            Console.WriteLine("I am IProgram Fun.");
        }
        staticvoid Main(string[] args)
        {
            Program pro =new Program();
            ((IAProgram)pro).Fun();
            Console.Read();
        }
    }

6.接口的覆蓋

  經過接口,能夠指定組件必須實現的方法,但不實際指定如何實現方法。抽象類能夠建立行爲的定義,同時提供用於繼承類的一些公共實現。對於在組件中實現多態行爲,接口和抽象類都是頗有用的工具。

  如今咱們把一個抽象類被容許把接口方法映射到抽象方法中:

interface ICompute
    {
        void Add();
        void Subtract();
    }

abstract class Compute  : ICompute
{
    void ICompute.Add() { ComputeAdd(); }
    void ICompute.Subtract() { ComputeSubtract(); }
    protected abstract void ComputeAdd();
    protected abstract void ComputeSubtract();
}

  這裏,從Compute派生的非抽象類要覆蓋ComputeAddComputeSubtract, 所以提供了ICompute的實際實現程序。

7.接口泛型

 很少說:基礎拾憶------泛型詳解

相關文章
相關標籤/搜索