2009/08/12

Class, Abstract Class, and Interface

最近在研究用 C# 寫 Plugin, 為了 plugin 寫了二篇文章,分別是Class Interface, 及 Plugins

這邊就有個問題,一般我們在寫程式,大概都只會用到類別 "Class", 書上講的抽象類別(Abstract Class)似乎很少用到,更別提界面(interface)。不過在用 Plugin 時,一直都是用界面(Interface), 為什麼呢?若看得懂英文的,請參考Abstract Class vs Interface一文。

.抽象類別: 抽象類別其實非常像一般的類別,可以擁有 Private 的成員及方法,當然不同的地方就在於它也可以擁有 Abstract 的成員及方法。

.界面: 可以簡單說,界面是更抽象的類別,只能擁有 Public 及 Abstract 的成員及方法。要換一種說法就是,界面不必宣告,一切都當成 public && abstract,而且而且,因為是抽象的,所以都不能實作。

用下面的範例來看會比較容易明白:


//Abstarct Class
public abstract class Vehicles
{
private int noOfWheel;
private string color;
public abstract string Engine
{
get;
set;
}
public abstract void Accelerator();
}

//Interface
public interface Vehicles
{
string Engine
{
get;
set;
}
void Accelerator();
}


文中提到一種使用時機,若繼承關係中,基礎類別有可能被用來產生實例的話,當然就只能用一般類別,但是若不會發生這種可能,用抽象類別會是比較好的。至於界面,則是這個基礎類別若有「預設行為」的話只能用抽象類別,否則它就只是個界面。

寫到這兒,也大概了解為何 Plugin 只能用界面了,因為,不可能為 Plugin 給什麼預設行為不是?

讓我們從抽象類別與界面的字面意義來思考,抽象類別畢竟是類別,只是它是抽象的,所以在繼承中需要被「overlay」,就像看到「筆」這個抽象概念時,你會知道可以寫,而且不管哪種筆的寫都「差不多」一樣。可是界面之所以是界面,就是因為你可以預期它要提供的功能是什麼,可是界面只停留在界面,怎麼實作是沒個準頭的,要實際繼承的人去實作。而之所以被稱為界面,也限定了繼承的人一定要「全部」實作。

0 意見: