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"); //調用類對象的方法。
}
}
程式輸出結果為:
以上是我的簡單總結,今天先寫到這兒,歡迎大家點評,謝謝!