Subtypes must be substitutable for their base types.子類必須可以替換基類編程
例:正方形IS-A矩形,所以咱們會設計成正方形繼承至矩形,然而假若有如下代碼:spa
public Rectangle IncreaseHeight(Rectangle r) { while(r.getHeight()<r.getWidth())) { r.setHeight(r.getHeight()++) } return r; }
就會有錯誤出現。設計
應用:在具體實如今,要求應該針對 「接口」或「抽象基類」進行編程,充分利用面向對象的多態特性,讓實現同一接口或抽象基類的子對象能夠互相取代而不影響到程序的其餘部分。code
反例:.NET基類庫中的ReadOnlyCollection類,ReadOnlyCollection<T>實現了ICollection<T>接口,但這接口中的Add()、Clear()方法對於只讀集合是無心義的。對象
No client should be forced to depend on methods it does not use blog
不該該強迫一個軟件組件依賴於它們不用的方法繼承
例:IRepository接口既有「命令」(Save,Update)又有「查詢」(Find,GetById)功能接口
public interface IRepository { public void Save(MyDataItem item); public void Update(MyDataItem item); public void Delete(int ItemId); public MyDataItem GetById(int ItemId); public List<MyDataItem> Find(Predicate<MyDataItem> pred); }
能夠拆分爲兩個接口:ip
public interface IMutableRepository { public void Save(MyDataItem item); public void Update(MyDataItem item); public void Delete(int ItemId); } public interface IQueryableRepository { public MyDataItem GetById(int ItemId); public List<MyDataItem> Find(Predicate<MyDataItem> pred); }
依賴注入:類自己不直接實例化它所依賴的類的對象,而是由外界動態了將其「注入(inject)"ci