C#2.0學習4—面向對象高級概念
一、接口
1. 接口的概念及作用
一個例子:一臺電腦上的主板和光驅,其實對主板來說,光驅只要是符合它所要求的規格就可以了,具體是哪種光驅,並不重要,它都能兼容。如果我更換一個光驅,沒有必要連主板也換。
當我們需要一個新的對象時,我們首先考慮,能否定義一個和原有對象功能一致的對象(兼容),而不是修改原有對象,或者做一個全新的對象
再如:一個數據庫系統中對數據的SIUD操作,我們應該如何設計呢,假設我們的系統是不能確定具體的數據庫,或者用戶要求變更到新的數據庫時,那我們是否要重新設計整個數據訪問層及與其相關的調用呢?
我們定義一個接口:
interface IDataAccess
{
public bool insert(Item)
public bool delete(string id)
public bool update(Item)
public List getData();
public Item getDataById(string id);
}
如果我們使用Sqlserver
我們就定義一個類實現上述接口
class SqlDataAcess : IDataAcess
{
//具體的sqlServer的操作
}
而在上層程序調用時我們可以簡單的使用如下形式調用
Item item= new Item();
IDataAcess da = new SqlDataAccess(); //此處如果應用反射可從配置文件中直接初始化對象,而不需如此硬編碼
//IDataAcess da = DataAccessFactory.createInstance(Configration.getDataType);
Da.insert(item);
現在如果要更換成Oracle,大家想應該如何做了
class OracleDataAcess : IDataAcess
{
//具體的OracleServer的操作
}
再把配置文件中的DataType改爲Oracle就行了,整個系統不用更改其它代碼
如下圖:
2. 接口的特性
爲了應對可變化的需求,應該針對接口編程,而非針對具體類編程
針對完成相同功能的程序,要提供一致的程序接口,方便程序的即插即用
代碼的實現是在具體類中,而非接口中,接口只聲明程序的功能,並不實現
二、抽象類
與接口類似,但它可以包含屬性,也可實現方法
三、面向對象設計原則
1.單一職責原則(SRP):
一個類應該僅有一個引起它變化的原因。
2.開放封閉原則(OCP):
類模塊應該是可擴展的,但是不可修改(對擴展開放,對更改封閉)
3.Liskov 替換原則(LSP):
子類必須能夠替換它們的基類
4.依賴倒置原則(DIP):
高層模塊不應該依賴於低層模塊,二者都應該依賴於抽象。
抽象不應該依賴於實現細節,實現細節應該依賴於抽象。
5.接口隔離原則(ISP):
不應該強迫客戶程序依賴於它們不用的方法。
四、設計模式與多態應用
多態的應用很廣泛,有很多模式都用到它。如:工廠方法,策略,模板模式等
所謂設計模式:是指前人的一種編程經驗。
上面的數據庫系統的例子就是應用到工廠方法模式
一個產品接口:IDataAccess 實現一致的數據操作
兩個具體實現類:SqlDataAccess和OracleDataAccess 分別是具體數據庫訪問的實現
一個工廠類:DataAccessFactory 作用爲針對不同的配置,生成不同的DataAccess
示例演示(演員表演節目項目)
用到的模式:工廠方法
多態的應用