跟蹤petshop系列四:反射的使用

 看這些東西,並不是一天兩天就可以看懂得,需要很多的知識點啊!實在看不懂的先放放,也許過一陣子會變得容易。還要時常回過頭來再瞧瞧會再給你一些驚喜。

在這裏他用的是工廠模式。
IAccount dal = PetShop.DALFactory.Account.Create();
調用這個後,也就調用了 SQLServerDAL的account類,他實現了接口的insert()方法.你看裏邊的:using IDAL就看清楚了.
// Call the DAL to insert the account
dal.Insert(account);

DALFactory.Account.Create();在這裏邊他用到web.config
用System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];則可以得到Web.config的<appsettings>節點中的關於系統中應該使用哪個數據訪問層(SqlserverDAL還是OracleDAL)的信息。因爲我在安裝PetShop3.0時選擇的是Sqlserver所以在此是:value="PetShop.SQLServerDAL",如果用的是Oracle那就是value="PetShop.OracleDAL" 了吧!而且這個文件也應該是可以更改的。接下來className=path+”.Account”返回的應該是PetShop.SQLServerDAL.Account,然後再用Assembly.Load加載PetShop.SQLServerDAL.dll,同時創建PetShop.SQLServerDAL.Account的實例,並以接口(PetShop.IDAL.IAccount)類型返回。這樣BLL調用IAccount接口時就會用PetShop.SQLServerDAL.Account類的實現代碼。
在petshop中,他調用了程序集,引用了SQLServerDAL中的Account類,這個類是繼承了接口IDAL的.在bll中調用接口的方法以前,先引入了SQLServerDAL中的Account類,也就是說bll中直接調用了sQLServerDAL.這就解決了,bll實現idal接口,但此接口怎麼會知道要調用哪個類來實現他呢.
那爲什麼要返回一個接口類型?   比方說:你可以返回與SQL數據庫相關的類也可以返回其他數據庫相關的類,但程序本身並不知道,是由你的web.config 中的配置確定的,這樣的話不沒有一個確定的返回類型。
    還是上面的例子,把SQL數據和其他的數據庫都繼承自接口類就行了,返回的類型都可以強制轉換爲接口的類型。繼承於相同接口的類有相同的處理方法,方法是在接口中定義在子類中實現的。這樣就算是類裏的實現不一樣,有相同的入口和相同的返回,那麼使用起來就很方便了。


更抽象的:接口A,類B實現了他,然後強制返回事例化B的接口,A.方法,應該就是調用了B的方法了吧!
interface A{}
class B:A{}   B bb = new B(); A aa = (A)bb; aa.方法.
事例如下:
:某公司有一臺特殊打印機,還可以使用一年,一年後可能換爲另一種打印機,這兩種打印機都特殊而貴.所以現在的程序希望換了打印機後也少量修改就可用.
方法:
1,定義一個打印機接口.
2,定義打印機類A,B,分別實現此接口.
3,定義一個工廠類,在類中可選擇返回由A實現的接口,或者由B實現的接口.
4,在程序中使用打印機時,就可以使用工廠類來調用打印機,而不需要知道具體的是什麼打印機.
如果打印機換了,只需要修改工廠類就行了.如果有一千個地方都調用過打印機,就不需要一個一個修改.修改一個地方就行了.接口充當一個隔離層的作用.

//定義打印機接口
interface Iprint

{
bool PrintData(string data);
}

//定義打印機類A,實現接口
class PrintA:Iprint
{
public virtual bool PrintData(string data)
{
//具體業務邏輯略
}
}

定義打印機類B,實現接口
class PrintB:Iprint
{
public virtual bool PrintData(string data)
{
//具體業務邏輯略
}
}

//定義工廠類
class PrintFactory{
public Iprint CreatePrint()
{
//返回一個由打機類A,或B實現的接口,比如         //重點在這裏
return new PrintA();
}
}

//通過工廠類,調用打印機
private void button1_Click(object sender,EventArgs e)
{
PrintFactory myFactory=new PrintFactory();
Iprint myPrint=myFactory.CreatePrint();
myPrint.PrintData("這樣做很方便啊");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章