ArcObjects开发中的多态与类型转换问题

来源:互联网 发布:淘宝封店了怎么办 编辑:程序博客网 时间:2024/04/28 23:29

 

在ArcObjects 中,众多的对象、接口眼花缭乱,之间关系更是错综复杂。对于初学者,甚至包括一些对AO相当了解的人对如何熟练转换接口未必能够做到胸有成竹。在许多教材、手册也往往是就事论事,给出代码了事。再好点的画个模型图,都没有从根本上解释清楚接口之间、接口与类之间的转换关系。特别是对于为什么由一个接口可以得出另一个接口,许多资料只是解释为接口查询,其实这只是技术层面的问题,接口查询主要是对于COM 的概念,对于.NET不太适用。那末在NET环境下开发AO,又如何理解接口之间的转换。利用多态的思想可以帮助我们和好地理解和使用和接口之间的转换。
什么是多态呢
       多态是面向对象编程语言非常重要的特性。利用多态,可以为应用程序增加灵活性,减少代码之间的紧密藕合。基本上每一种面向对象的编程语言都提供了多态性,掌握好多态,是步入面向对象程序设计大门非常重要的一步。什么是多态呢?通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型、或者在实现接口时用作任何接口类型,这称为多态性。C# 中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object 当作基类型。
       多态体现了对象的功能特性的不同方面,比如实现不同接口。体现了对象继承的层次关系,继承基类。
AO中的多态
AO中的组件类(CoClass)都是多态的。例如 SimpleFillSymbol CoClass ,实现了以下接口,
        IClone (esriSystem)
        IDisplayName
        IFillSymbol
        IMapLevel
        IPersist
        IPersistStream (esriSystem)
        IPropertySupport (esriSystem)
        ISimpleFillSymbol
        ISymbol
        IXMLSerialize (esriSystem)
那末它就具有以上接口类型。
派生接口也具有多态性。例如 ISimpleFillSymbol 继承自 IFillSymbol  ,同就同时兼具两者两种接口类型。
结论一:具有继承关系或实现关系的类与接口之间可以进行类型转换,这是多态的一种表现。
例如:IFillSymbol fillSymbol=new SimpleFillSymbolClass();
ISymbol  symbol=new SimpleFillSymbolClass();
IXMLSerialize serialize =new SimpleFillSymbolClass();
就是说SimpleFillSymbol具有多态,那么就可以直接使用其中任何一态。
结论二:具有相同基类(或相同实现类)的接口之间可以转换,但需要显示说明。
例如:ISymbol  symbol=new SimpleFillSymbolClass();
IXMLSerialize serialize =(IXMLSerialize )symbol;
其实质与结论一的情况是一样,虽然两种类型不同,也无继承关系,而是利用共同基类的多态性。