跟踪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("这样做很方便啊");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值