尊重作者,請保留 www.it55.com 連結字樣。
在學習c# 2.0的新特性以前,我們一起來看看c#傳統印象裡的介面、抽象、委託是怎麼一回事。
1、介面包含諸如方法和屬性定義等一系列的聲明。而這些介面必須有實現介面的類來實現。
定義介面:
[存取許可權] interface 介面名稱
{
介面體;
}
對介面的存取許可權比較常用的有public或internal。
在介面體中定義了各種各樣的實作類別時必須提供的代碼項。介面可以定義方法、屬性、索引、事件,但不包括域。
舉例:所有車輛的操作都包括“Start”和"Stop",狀態只有運行和非運行,我們可以使用Start()和Stop()方法來模型化這些功能,用"started"來表示車輛的運行與否。如:
public interface IDrivable
{
void Start();
void Stop();
bool started
{
get;
}
}
介面只規範started的get屬性、車輛的兩種操作函數,傳回型別void
下面的類來實現這個介面:
public class Car : IDrivable
{
private bool _started = false;
public void Start()
{
_started = true;
}
public void Stop()
{
_started = false;
}
public bool started
{
get
{
_return started;
}
}
}
接下來,程式就可以通過執行個體化這個Car類來實現對車輛的操作了:
Car myCar = new Car();
myCar.Start();
2、抽象類別有下列特點:(此處原文出自互連網,經筆者部分修改,感謝原作者)
聲明一個抽象方法使用abstract關鍵字;
一個類中可以包含一個或多個抽象方法;
抽象類別中可以存在非抽象的方法;
抽象類別不能被直接被執行個體化;
實現抽象類別用“:”(冒號),實現抽象方法用override關鍵字;
抽象類別可以被抽象類別所繼承,結果仍是抽象類別;
抽象方法被實現後,不能更改修飾符,並且在使用之前必須被重載(override)。
例如:
public abstract class Person
{
public abstract void SayHello();//抽象方法
public void about()//非抽象方法
{
Console.WriteLine("Abstract Demo");
}
}
public class Student : Person
{
public override void SayHello()//抽象方法的重載
{
Console.WriteLine("SayHello");
}
}
class MainClass
{
public static void Main()
{
new Student().SayHello();//使用重載後的類和方法
}
}
3、委託(此處原文出自互連網,寫的比我透徹,所以直接引用,感謝原作者)
委託和事件這兩個概念是完全配合的。委託僅僅是函數指標,那就是說,它能夠引用函數,通過傳遞地址的機制完成。
委託是一個類,當你對它執行個體化時,要提供一個引用函數,將其作為它建構函式的參數。
每一個委託都有自己的簽名,例如:Delegate int SomeDelegate(string s, bool b);是一個委託申明,在這裡,提及的簽名,
就是說SomeDelegate 這個委託 有 string 和 bool 類型的形參,返回一個int 類型。
上面提及的:當你對委託執行個體化時,要提供一個引用函數,將其作為它建構函式的參數。
這裡要注意了:被引用的這個函數必須和委託有相同的簽名。
看下面的函數:
private int SomeFunction(string str, bool bln){...}
你可以把這個函數傳給SomeDelegate的建構函式,因為他們有相似的簽名(in other words,他們都有相同的形參類型和個數,並且返回相同的資料類型)。
SomeDelegate sd = new SomeDelegate(SomeFunction);
sd 引用了 SomeFunction,也就是說,SomeFunction已被sd所登記註冊,如果你調用 sd,SomeFunction 這個函數也會被調用,
記住:我所說 SomeFunction的含義,後面,我們會用到它。
委託類似於函數指標,它既能引用靜態(static)方法,也能引用執行個體方法。
委託使用分三步:1、委託聲明。2、委託執行個體化。3、委託調用。
例:
using System;
namespace 委託
{
delegate int NumOpe(int a,int b); //委託聲明
class Class1
{
static void Main(string[] args)
{
Class1 c1 = new Class1();#p#分網頁標題#e#
NumOpe p1 = new NumOpe(c1.Add); //委託執行個體化
Console.WriteLine(p1(1,2)); //委託調用
Console.ReadLine();
}
private int Add(int num1,int num2)
{
return(num1+num2);
}
}
}
例中,委託NumOpe引用了方法Add。
委託聲明了以後,就可以象類一樣進行執行個體化,執行個體化時把要引用的方法(如:Add)做為參數,這樣委託和方法就關聯了起來,就可以用委託來引用方法了。
委託和所引用的方法必須保持一致:參數個數、類型、順序必須完全一致;傳回值必須一致。
下一節我們會在本節基礎上分析學習:c# 2.0新特性 泛型