当前位置: 代码迷 >> .NET新技术 >> 关于接口、类的概念,
  详细解决方案

关于接口、类的概念,

热度:514   发布时间:2016-04-25 01:24:19.0
关于接口、类的概念,请教大家!
            IWorkspaceFactory pWorkspaceFactory;                                                                                  // ①  
            pWorkspaceFactory =new ShapefileWorkspaceFactoryClass( );                                        // ②       
            IFeatureWorkspace pFeatWS;                                                                                                     // ③      
            pFeatWS=pWorkspaceFactory.openFromFile(@"D:\Data\",0) as IFeatureWorkspace;   // ④
            IFeatureClass pFeatureClass=pFeatWS.OpenFeatureClass("Cities");                              // ⑤    
请教大家:(1)我们知道,接口是不能实例化的,但是第① 行代码中,为什么又定义了接口变量pWorkspaceFactory呢,而且第二行将一个类的实例赋值给了这个接口变量?
                  (2)第④行为什么又能将一个接口实例赋值给接口变量pFeatWS呢?
最近总是想这个概念性的东西,始终还是搞不明白,希望能得到大家的解决,谢谢!
------解决思路----------------------
1.变量可以是某种类型的接口的,所说的不能实列化是指不能new 接口  只能new 类 或继承这个接口的类。
2.openFromFile 他实际反回的是 继承IFeatureWorkspace 这个接口的实列。as IFeatureWorkspace 说明是转换成接口类型
你记住,接口只能是用来被继承的。他不能被实例就是不能直接new 接口
------解决思路----------------------
首先,假设一个变量可以引用任何东西。变量是“引用”,他就跟你上小学时学到的x、y一样,x代表“长度”而y代表“宽度”,或者x代表“水池的体积”而y代表“水龙头的注水速度”。这时候不要考虑x、y有什么类型。

那么你就能看到,纠结于“变量是不能实例化的”是自相矛盾的。它本来就是轻灵的变量,而不是对象。只不过我们一般为了省事儿而说“对象pFeatWS”,其实pFeatWS根本不是对象而是变量,我们省得说“变量pFeatWS所引用的对象”了,而是简化。

变量跟它所指的对象根本就是分开的。变量可以引用任何变量。只不过,如果你写代码
A a= new X();
B b= a;
C c= a;

这里c#编译器会帮你检查一下你申明的类型X、A、B、C相互有兼容性(继承性),而并不是说a变量只能指向A类型的对象。

不但c#编译器会帮你检查类型兼容性(从而让的大部分bug消灭在发布之前),.net framework系统也会在运行时帮你检查有没有漏网之鱼(比如说针对强制类型转换之类的危险操作就只能在运行时检测),从而尽早地让你的程序抛出异常,而不至于像 javascript等动态语言那样让变量引用着完全错乱的类型对象还继续向后执行。

总之,变量只是引用对象的方法。不要纠结于“赋值类型”,变量声明的类型只要兼容于变量引用的对象的类型就行了。
  相关解决方案