C#中的接口
目錄
接口的定義
接口與抽象類
接口的的實現
接口的的多態性
一.接口的定義<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
定義:定義一個協定。實現接口的類或結構必須遵守其協定。
簡單的說就是接口或者類之間交互時遵守的一個顯示定義。最初接觸“類與類之間通過接口交互”這個概念時,誤以爲接口就是類公開的方法,類之間通過類的方法進行交互。其實接口是獨立於類的一個定義。接口定義類之間交互的標準。
那麼類與類之間直接交互就好了,爲什麼還要使用接口呢?
這主要是因爲:接口是類之間交互內容的一個抽象,把類之間需要交互的內容抽象出來定義成接口,可以更好的控制類之間的邏輯交互。可見接口內容的抽象好壞關係到整個程序的邏輯質量;另外可以在任何時候通過開發附加接口和實現來添加新的功能;
關於接口一個很重要的概念:接口只包含成員定義,不包含成員的實現,成員的實現需要在繼承的類或者結構中實現。
接口的成員包括:方法,特性,索引器,事件。
注意:接口不包含字段。
實現接口的類必須嚴格按其定義來實現接口的每個方面
接口本身一旦被髮布就不能再更改,對已發佈的接口進行更改會破壞現有的代碼。
一個典型的接口示例:
using System;
using System.Colletion;
public delegate voic Chang(object sender,object event)//定義一個委託
public interface Ibroker //定義一個股票經濟人接口
{
string GetRating (string stock);//一個獲得金額的方法(此處沒有實現)
decimal pricePerTrade //定義一個設置每股價格的特性
{
get; //沒有實現的
set;
}
decimal this(string StockName) //定義索引器
{
get;
set;
}
event Change pricechange; //定義接口的事件
}
二.接口與抽象類
抽象類和接口在定義上和功能上有很多相似的地方,具體在程序中使用抽象類還是接口需要比較抽象類和接口的具體差別。
抽象類:一種不能實例化而必須從中繼承的類,抽象類可以提供實現,也可以不提供實現
子類只能從一個抽象類繼承
抽象類應主要用於關係密切的對象
如果要設計大的功能單元,則使用抽象類。
如果預計要創建組件的多個版本,則創建抽象類
接口:是完全抽象的成員集合,不提供認識實現。
類或者結構可以繼承幾個接口。
接口最適合爲不相關的類提供通用功能
如果要設計小而簡練的功能塊,則使用接口
接口一旦創建就不能更改。如果需要接口的新版本,必須創建一個全新的接口
三.接口的的實現
接口的實現分爲:隱式實現和顯式實現。如果類或者結構要實現的是單個接口,可以使用隱式實現,如果類或者結構繼承了多個接口那麼接口中相同名稱成員就要顯示實現。顯示實現是通過使用接口的完全限定名來實現接口成員的。
針對上面的例子 我們可以這樣實現接口:
public class testInterface: Ibroker //定義一個繼承ibroker接口的類
{
hashtable hash=new hashtable();
decimal pricepertrade;
public testInterface(decimal price) // 構造函數
{
pricepertrade=price ; //初始化字符串
}
public string Getrating (string stock) //隱式實現接口的方法
{
return “buy”;
}
public decimal Ibroker.pricepertrade // 顯式實現接口的特性
{
get
{
return pricepertrade;
}
set
{
pricepertrade=value;
pricechange(“Finacebroker”,value);
}
public decimal this(string stockName)
{
get
{
return (decimal)Hash[stockName];
}
set
{
hash.add(stockname,value);
}
}
}
public event changer pricechange;//接口中的所有成員都要實現
}
四.接口中的多態
多個類繼承了相同的接口就實現了接口的多態性,接口的多態性的訪問和類的多態性訪問一樣。下面的例子說明怎麼實現接口的多態性訪問:
public class InterfaceTester
{
public stratic int Main (string[] args)
{
string recommendation;
Arraylist Brokers=new Arraylist;//定義一個列表
Brokers.add(new firstBroker(7.21m));//添加第一個繼承接口的類
Brokers.add(new secondBroker(12.3m));// 添加第二個繼承接口的類
InterfacetTester new Iftst=new InterfacetTester
Foreach (Ibroker broker in Brokers)
{
broker.pricechange+=new change(iftst.pricepertradechange);
broker[“adc”]=12.33m;
broker[“rty”]=11.23ml
broker.pricepertrade=12.55m;
}
}
}