文章《淺析C#中接口的重要性》中講述了如何聲明和使用接口。
但是C#具有abstract關鍵字形成的抽象類,那麼二者我們該如何選擇呢!
C#允許把類和函數聲明為abstract。抽象類不能實例化,而抽象函數也不能直接實現,必須在非抽象的派生類中重寫。顯然,抽象函數本身是虛擬的,但是不能提供virtual關鍵字。如果類包含了抽象函數,則該類也是抽象的,必須聲明為抽象。
定義抽象類:
public abstract class Animal
{
protected string _name;
public abstract string Name
{
get;
}
public abstract void Show();
public void MakeVoice()
{
Console.WriteLine(All animals can make voice!);
}
}
定義接口:
public interface IAction
{
void Move();
}
實現抽象類和接口:
public class Duck : Animal, IAction
{
public Duck(string name)
{
_name = name;
}
public override void Show()
{
Console.WriteLine(_name + is showing for you!);
}
public override string Name
{
get{return _name;}
}
public void Move()
{
Console.WriteLine(Duck also can swim.);
}
}
public class Dog : Animal, IAction
{
public Dog(string name)
{
_name = name;
}
public override void Show()
{
Console.WriteLine(_name + is showing for you!);
}
public override string Name
{
get{return _name;}
}
public void Move()
{
Console.WriteLine(_name + Duck also can run.);
}
}
客戶端實現:
public class TestAnimal
{
public static void Main(string [] args)
{
Animal duck = new Duck(Duck);
duck.MakeVoice();
duck.Show();
Animal dog = new dog(Dog);
dog.MakeVoice;
dog.Show();
IAction dogAction = new Dog(A big dog);
dogAction.Move();
}
}
1.抽象類是提取具體類的公因式,而接口是為了將一些不相關的類“雜湊”成一個共同的群體。
2.所有代碼共有和可擴展性考慮,盡量使用Abstract Class。
3.當在差異較大的對象間尋求功能上的共性時,使用接口;當共性較多的對象間尋求功能上的差異時,使用抽象類。
4.如果要創建組件的多個版本,建議使用抽象類。如果設計小而簡練的功能塊,則使用接口。