本文面向的讀者
NET 應用程序設計師和程序員
關鍵字
Type– 類型
Class - 類
Abstract - 抽象的
Interface - 接口
Member - 成員
Method - 方法
Property - 屬性
預備知識在閱讀本文時您應當了解NET編程的基本知識並且已經掌握Class Abstract Class 和 Interface全部知識這裡我僅簡單介紹一下他們的基本知識本文的例子由C#編寫期望您對C#編程有一定的了解
正文
我們無法創建一個Abstract Class或Interface的實例(INSTANCE)讓我們從Abstract Class和Interface的定義來看他們的不同Abstract Class可以包含Abstract Methods 和 Abstract Properties 也可以包含其他的Members象正常的Class一樣而Interface只能包含Abstract Methods和Properties(屬性)Interface中的所有Methods和Properties不需要加Abstract和Public關鍵字因為這兩個關鍵字在Interface中是默認的舉例如下
//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();
}
通常來講在設計時優先考慮使用Class或Abstract Class而不是InterfaceInterface的主要缺點是靈活性比較差一旦你定義好了Interface那麼它的Members就固定了如果你要對已經發布的程序添加新的Method就會破壞你已經的實現該接口的Type(ClassStruct等)因為你必須在你已有的Type中實現新的方法否則你的程序將無法通過編譯
例如類Car和Train實現了接口Vehicles 現在我們要給接口Vehicles再加一個方法Brake() 如果我們現在編譯類Car和Train編譯器將報錯
public interface Vehicles
{
…
//新添加的方法
void Brake();
}
要修復這個錯誤我們不得不在類Car和Train中實現方法Brake() 示范代碼如下
public class Car : Vehicles
{
…
public void Brake()
{
SystemConsoleWriteLine(Stop your car);
}
}
public class Train : Vehicles
{
…
public void Brake()
{
SystemConsoleWriteLine(Stop your train);
}
}
如果我們使用抽象類或正常類Vehicles我們僅僅需要在類Vehicles中添加Brake()方法並且實現這個方法然後我們根據具體需要來決定是否要覆蓋類Car 或Train中的Brake()方法
public abstract class Vehicles
{
…
//新添加的方法無需在它的子類中覆蓋這個方法
public void Brake()
{
SystemConsoleWriteLine(Stop your vehicles);
}
}
Class則可以提供更好的靈活性你可以給Class添加任何Members只要添加的不是Abstract Method即可(也就是說你要提供一個有具體實現的方法)這樣就不會影響從該Class繼承的類已有代碼無需做任何改變
設計原則
; 優先考慮使用Class或Abstract Class而不是Interface
; 使用Abstract Class代替Interface來降低Class繼承層次之間的耦合關系
; 使用Interface如果你需要給一個值類型實現(Value Type 象STRUCT就是值類型)多態繼承(Polymorphic Hierarchy)(值類型除了從Interface繼承以外不能從其他Type繼承)
; 在需要多重繼承的情況下可以考慮使用Interface
From:http://tw.wingwit.com/Article/program/net/201311/12850.html