|
前几天再写asp.net 的三层结构,数据库要求跨平台,用到反射技术来动态生成数据库类对象,用接口使方法统一. 问题就在这个接口上: 我在csdn .net论坛上发帖的内容为: 地址为:http://community.csdn.net/Expert/topic/5103/5103400.xml?temp=.284115 //解决方案一:
//Interf.cs 在项目InterF中 namespace InterF { public interface I_InterF { string F(); } }
//A.cs 在项目A中 using InterF namespace A { public class A_Class:I_InterF //继承 InterF 接口 { public string F() //实现 InterF 中的 F() { return "aaaaaaa"; } } }
//B.cs 在项目B中 using InterF namespace B { public class B_Class:I_InterF //继承 InterF 接口 { public string F() //实现 InterF 中的 F() { return "bbbbbbb"; } } }
//Factory.cs 在项目Factory中 namespace Fac { public class Fac_Class { public I_InterF Fac_Function { string assumellyName = ConfigurationManager.AppSettings["AssumelyName"]; string constructorName = ConfigurationManager.AppSettings["ConstructorName"]; return (I_InterF)Assembly.Load(assumellyName).CreateInstance(constructorName); } } }
//web.config <add key="AssumelyName" value="A"/> <add key="ConstructorName" value="A.A_Class"/>
//Test.cs 在项目BLL中 using Fac; using InterF;
namespace BLL { public class BLL_Class { public string BLL_Funtcion() { return (new Fac_Class()).Fac_Function().F(); } } }
------------------------------------------------------------------------------- //解决方案二:
//A.cs 在项目A中 namespace A { public class A_Class { public string F() { return "aaaaaaa"; } } }
//B.cs 在项目B中 namespace B { public class B_Class { public string F() { return "bbbbbbb"; } } }
//Factory.cs 在项目Factory中 namespace Fac { public class Fac_Class { public Object Fac_Function { string assumellyName = ConfigurationManager.AppSettings["AssumelyName"]; string constructorName = ConfigurationManager.AppSettings["ConstructorName"]; return Assembly.Load(assumellyName).CreateInstance(constructorName); } } }
//web.config <add key="AssumelyName" value="A"/> <add key="ConstructorName" value="A.A_Class"/>
//Test.cs 在项目BLL中
using Fac; using A; using B; namespace BLL { public class BLL_Class { public string BLL_Funtcion() { return (new Fac_Class()).Fac_Function().F(); } } }
问题一: 解决方案一 在Factory.cs中制造了A的对象已接口InterF的方式返回,在 BLL中调用的是 Interf.cs中的F(),虽然A.cs和B.cs都继承了InterF的接口,为什么调用Interf.cs中的F() 就能得到 "aaaaaaa" 应该是调用A中的F()才能得到的呀
问题二: 解决方案二 没有使用接口,A中有个F(),B中也有个F() 分别再两个命名空间中(A,B) 制造一个A的对象:(new Fac_Class()).Fac_Function() 调用A中的方法:(new Fac_Class()).Fac_Function().F() 会出错 A中的F(),B中的F() 不是再两个命名空间中的吗,为什么会出错
下面是 aafshzj(上海北京) ( ) 信誉:100 Blog 的回答:
问题一:问题在于你创建的是A的实例啊,A的实例被通过InterF引用调用F方法得到 "aaaaaaa"不是很正常吗?你认为应该得到什么?、
问题二:出错很正常啊,原因不在于A和B的共存而在于(new Fac_Class()).Fac_Function()创建的是一个object,而object根本没有F这个方法。
InterF只是接口,可以被看作纯Abstract类型。它的所有方法相当于默认加了abstract/virtual修饰符的,实现接口的类型的接口方法相当于默认加了override方法的。这意味着什么呢?意味着InterF引用的实例在执行借口方法时,将执行其实现类型的方法。这也很自然,因为接口方法都是没实现的空方法(不是方法体为空,是方法本身实际上就相当于空指针),也只有实现其具体实例的实际类型方法才合适。
实际上所有类型实例,无论其以什么基类型被引用,其实际执行的基类方法都是override层层覆盖中最后覆盖的一个,也就是实际实例的方法(不考虑new 修饰符中断override覆盖的情况)。
|