2012-12-30 58 views
27

我見過以下代碼佈局閱讀論壇和其他博客帖子,並經過修改以提出幾個問題。c#抽象類實現接口

public interface IService<T> 
{ 
    int Add(T entity); 
    void Update(T entity); 
} 

public abstract class ServiceBase<T> : IService<T> 
{ 
    public int Add(T entity) { ... } 
    public void Update(T entity) { ... } 
} 

public interface ICarService : IService<Car> 
{ 
} 

public class SomeBaseClass : ServiceBase<Car>, ICarService 
{ 
    public int Add(Car entity); 
    public void Update(Car entity); 
} 

我不明白的是讓抽象類實現接口的好處。對我來說,它只是有點重複,我不明白有一個抽象類實現接口的好處。

  1. 爲什麼不抽象類ServiceBase<T>只是定義爲不需要繼承IService接口?這是雙倍的代碼?
  2. 爲什麼SomeBaseClass也暗示ICarService? ServiceBase不應該足夠嗎?

回答

32

廣告1:額外的抽象基類允許您在不破壞實現的情況下演化接口。假設沒有抽象基類,並且你會擴展接口,比方說增加一個新方法。然後你的實現被破壞了,因爲你的類不再實現這個接口。

使用額外的抽象基類可以分開這個:如果向接口添加一個新方法,您可以在基類中提供虛擬實現,並且所有子類都可以保持不變,並且可以採用以在稍後的時間點匹配新的界面。此外,這個組合允許你定義一個契約(使用接口)並提供一些默認機制(使用抽象基類)。任何使用默認設置的人都可以繼承抽象基類。任何想要對任何小細節進行超級精細控制的人都可以手動實現接口。

廣告2:從技術角度來看,沒有需要來實現最終類中的接口。但是,這又一次讓你能夠彼此分開進化。 A CarService肯定是Service<Car>,但可能更多。也許只有CarService需要一些額外的東西,不應該進入公共接口或服務基類。

我想這就是爲什麼;-)

+1

有一件事我沒有通知是在SomeBaseClass我總是上說,「X隱藏了繼承的成員Y.使用new關鍵字,如果藏匿之意」的方法的警告。由於抽象類具有「添加」,服務接口具有「添加」,它不知道該怎麼做。 – fes

+1

你最後一句中的「它」是什麼意思?編譯器警告絕對正確...... –