本文轉自:http://blog.***/article.asp?id=58
目錄
介面的定義
介面與抽象類別
介面的的實現
介面的的多態性
一.介面的定義
定義:定義一個協定。實現介面的類或結構必須遵守其協定。
簡單的說就是介面或者類之間互動時遵守的一個顯示定義。最初接觸“類與類之間通過介面互動”這個概念時,誤以為介面就是類公開的方法,類之間通過類的方法進行互動。其實介面是獨立於類的一個定義。介面定義類之間互動的標準。
那麼類與類之間直接互動就好了,為什麼還要使用介面呢?
這主要是因為:介面是類之間互動內容的一個抽象,把類之間需要互動的內容抽象出來定義成介面,可以更好的控制類之間的邏輯互動。可見介面內容的抽象好壞關係到整個程式的邏輯品質;另外可以在任何時候通過開發附加介面和實現來添加新的功能;
關於介面一個很重要的概念:介面只包含成員定義,不包含成員的實現,成員的實現需要在繼承的類或者結構中實現。
介面的成員包括:方法,特性,索引器,事件。
注意:介面不包含欄位。
實現介面的類必須嚴格按其定義來實現介面的每個方面
介面本身一旦被發布就不能再更改,對發行的介面變更會破壞現有的代碼。
一個典型的介面樣本:
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;
}
}
}