上篇:www.2cto.com/kf/201111/109744.html
1, 接口的定義?
答:接口表示一組函數成員而不實現成員的引用類型,類和結構可以實現接口。
2, 接口的意義及為什麼要使用接口?
要理解接口的意義以及為什麼它是有用的,讓我們先來看看下面的代碼,它接受了一個沒有排序的整數數組並且按升序進行排序。
class Program
{
static voidMain(string[] args)
{
var myInt = new[] { 20,4,16,9,2};//隱式創建整形數組。
Array.Sort(myInt);//調用Array類的Sort方法對數組進行排序,默認為升序。
foreach (var item in myInt)//使用foreach語句遍歷數組。
{
Console.Write("{0}",item);
Console.Write("");
}
Console.ReadKey();
}
}
程序輸出結果為:
Sort方法在int數組上工作得很好,但是如果我們嘗試在自己的類上使用會發生什麼樣的結果呢?如下代碼所示:
class Program
{
static voidMain(string[] args)
{
var myInt=new []{20,4,16,9,2};//隱式創建整形數組。
MyClass[] mc=new MyClass[5];//創建MyClass對象數組。
for (int i = 0; i < 5; i++)//初始化數組
{
mc[i] = new MyClass();
mc[i].TheValue=myInt[i];
}
Array.Sort(mc);//調用Sort方法時會引發異常。
foreach (var item in mc)
{
Console.Write("{0}",item);
Console.Write("");
}
Console.ReadKey();
}
}
class MyClass//自定義類MyClass
{
public int TheValue;
}
程序會拋出一個異常,如下圖:
這是什麼原因呢?Sort不工作的原因是,對於用戶自定義對象的數組而言,它不知道如何比較用戶自定義對象和確定它們的次序,它需要數組中的對象實現IComparable接口。在Sort運行時,它通過調用元素的CompareTo方法並傳入另外一個元素的引用作為參數來實現數組的一個元素和另一個元素的比較。
所以,我們可以通過讓類實現IComparable接口來使Sort方法可以用於MyClass對象。
代碼如下:
class Program
{
static voidMain(string[] args)
{
var myInt = new[] { 20,4,16,9,2};
MyClass[] mc = new MyClass[5]; //創建類MyClass對象的數組。
for (int i = 0; i < 5; i++) //初始化數組
{
mc[i] = new MyClass();
mc[i].TheValue=myInt[i];
}
PrintOut("原始數組順序:", mc);//調用靜態PrintOut方法輸出初始數組。
Array.Sort(mc);
PrintOut("經過Sort後的順序:", mc);//調用靜態PrintOut方法輸出排序後的數組。
Console.ReadKey();
}
static void PrintOut(string s, MyClass[] mc)//定義靜態方法PrintOut實現遍歷數組並輸出數組元素。
{
Console.Write(s);
foreach (var item in mc)
{
Console.Write("{0}",item.TheValue);
Console.Write("");
}
Console.WriteLine();//換行
}
}
class MyClass : IComparable //類實現接口
{
public int TheValue;
public int CompareTo(object obj) //接口成員方法實現
{
MyClass mc=(MyClass)obj;
if (this.TheValue < mc.TheValue) return -1;
if (this.TheValue > mc.TheValue) return 1;
return 0;
}
}
程序輸出結果為:
在MyClass類中實現接口IComparable接口的示意圖:
3, 聲明接口?
例如:
interface IMyInterface1 //聲明接口IMyInterface1
{
int Do1(int i, long l);
double Do2(string s, long l);
}
需要注意以下幾點:
1> 聲明接口使用interface關鍵字。
2> 接口名稱必須從大寫的I開始(如:ISaveable)。
3> 接口函數成員的聲明不能包括任何實現代碼,而在每一個成員聲明的主體的後面必須使用分號。
4> 接口聲明可以有任何的訪問修飾符public,protected,private等,但是接口的成員是隱式public的,不允許有任何訪問修飾符,包括public。
4, 實現接口?
只有類和結構才能實現接口。要實現接口,類或結構必須注意以下幾點:
1> 在基類列表中包括接口名稱。
2> 為每一個接口的成員提供實現。
3> 如果類從基類繼承並實現接口,基類列表中的基類名稱必須放在任何接口之前。
例如:
interface IMyInterface1 //聲明接口IMyInterface1
{
int Do1(int i, long l);
double Do2(string s, long l);
}
class MyClass : IMyInterface1 //實現接口
{
int Do1(int i, long l) //實現接口成員
{
//todo:方法體
}
double Do2(string s,long l)
{
//todo:方法體
}
}
5, 簡單接口的示例?
代碼如下:
interface IIfc1 //聲明接口
{
void PrintOut(string s);
}
class MyClass : IIfc1 //實現接口。
{
public void PrintOut(string s) //實現接口成員
{
Console.WriteLine("Calling through:{0}",s);
Console.ReadKey();
}
}
class Program
{
static voidMain(string[] args)
{
MyClass mc = new MyClass(); //創建實例
mc.PrintOut("object"); //調用類對象的方法。
}
}
程序輸出結果為:
以上是我的簡單總結,今天先寫到這兒,歡迎大家點評,謝謝!
摘自:永遠的麥子
<script></script>