面向对象的三大特性:继承、封装、多态,都可以在Flex开发中找到它们的身影,ArcGIS Flex API充分利用了Flex面向对象的语法机制进行了设计和扩展,前一篇谈到的事件就是继承了flash.events.Event,这篇文章将通过一个典型GeoRSS Demo分析Flex的面向对象。
最基本的一个类封装:
package com.esri.ags.samples { public class Namespaces{ public static const RDF_NS:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); public static const DC_NS:Namespace = new Namespace("http://purl.org/dc/elements/1.1/"); public static const SY_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/syndication/"); public static const CO_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/company/"); public static const TI_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/textinput/"); public static const RSS_NS:Namespace = new Namespace("http://purl.org/rss/1.0/< /span>"); public static const ATOM_NS:Namespace = new Namespace("http://www.w3.org/2005/Atom"); public static const ATOM_03_NS:Namespace = new Namespace("http://purl.org/atom/ns#"); public static const XHTML_NS:Namespace = new Namespace("http://www.w3.org/1999/xhtml"); public static const CONTENT_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/content/"); public static const GEORSS_NS:Namespace = new Namespace("http://www.georss.org/georss"); public static const GEOWGS_NS:Namespace = new Namespace("http://www.w3.org/2003/01/geo/wgs84_pos#"); public static const GEO_NS:Namespace = new Namespace("http://www.w3.org/2003/01/geo/"); public static const GML_NS:Namespace = new Namespace("http://www.opengis.net/gml"); public function Namespaces(singletonEnforcer:SingletonEnforcer) { }}}class SingletonEnforcer{ } 首先是Flex有package的概念,易于将类分类存放,并且可以避免命名相同的情况,其次public、class、static、const关键字都是我们非常熟悉的,它们的含义和常见OO语言的相同,代码申明了多个静态常量,存储RSS来源。
Namespaces 类中有一个构造函数,和Java、C#相同,需要注意的是ActionScript不支持函数重载,最初这一点让大家不是很理解,但要知道,ActionScript和Javascript一样,都遵从ECMAScript 262规范,后面的同名函数会覆盖前面的,从另外一个角度去考虑,在as和js中,函数就是一个对象,同名的对象不可能同时存在于一个命名空间下,这点和 Java、C#有很大区别,所以要解决函数重载问题,要么使用不同名函数,要么通过一个参数去判断调用哪个函数。
因此我们可以这样来设计多态:
function doWithString(arg: string ) { return arg;} function doWithInteger(arg: int ) { return arg;} 或者是:
style="color: #0000ff;">if (arguments.length == 1 ) { if (arguments[0] typeof 'String') { doWithString(arg); } if (arguments[0] typeof 'Int') { doWithInteger(arg); }} else if (arguments.length == 2 ) { } Flex继承采用了prototype原型,经过封装之后我们可以直接使用extends关键字实现常用继承功能:
public class GeoRSSProvider extends EventDispatcher { } 可以发现,Flex在ECMAScript 262基础上还是做出了不少工作以支持常规面向对象的设计理念,开发者可以很方便的将OO思想应用到Flex之中,Flex里可以发现 Javascript、Java的身影,并加入了自己的一些语法习惯,例如变量类型或实例类型都放置在后面,和常规使用习惯稍有出入。
再看GeoRSSUtil功能类,提供了一系列静态方法来解析资源中所提供的地理信息:
package com.esri.ags.samples { import com.esri.ags.geometry.Geometry;import com.esri.ags.geometry.MapPoint;import com.esri.ags.geometry.Polygon;import mx.utils.StringUtil; public class GeoRSSUtil{ private static const GEORSS : Namespace = Namespaces.GEORSS_NS; private static const GEOWGS : Namespace = Namespaces.GEOWGS_NS; private static const GEO : Namespace = Namespaces.GEO_NS; private static const GML : Namespace = Namespaces.GML_NS; public function GeoRSSUtil(singletonEnforcer:SingletonEnforcer) { } public static function toGeometry( x : XML ) : Geometry { const geoLat : String = String(x.GEOWGS::lat ); const geoLon : String = String(x.GEOWGS::long ); if( geoLat && geoLon ) { return new MapPoint( Number( geoLon ), Number( geoLat )); } const georssPoint : String = String(x.GEORSS::point); if( georssPoint ) { return parseGeoRSSPoint(georssPoint); } const pointList : XMLList = x.GEO::point; if( pointList && pointList.length() > 0 ) { const geoPoint : XML = pointList[0]; const geoPLat : Number = Number(geoPoint.GEO::lat); const geoPLon : Number = Number(geoPoint.GEO::long); return new MapPoint( geoPLon, geoPLat ); } const georssPolygon : String = String(x.GEORSS::polygon); if( georssPolygon ) { return parseGeoRSSPolygon( georssPolygon); } const whereList : XMLList = x.GEORSS::where; if( whereList && whereList.length() > 0 ) { const pos : String = whereList[0].GML::Point[0].GML::pos[0]; const arr : Array = pos.split(" "); const gmlLat : Number = Number(arr[0]); const gmlLon : Number = Number(arr[1]); return new MapPoint( gmlLon, gmlLat ); } return null; } private static function parseGeoRSSWhere( x : XML ) : Geometry { return null; } private static function parseGeoRSSPoint( text : String ) : Geometry { const tokens : Array = StringUtil.trim(text).split(" "); const lat : Number = Number(tokens[0]); const lon : Number = Number(tokens[1]); return new MapPoint( lon, lat); } private static function parseGeoRSSPolygon( text : String ) : Geometry { const path : Array = []; const tokens : Array = StringUtil.trim(text).split(" "); for( var i:int=0, j:int=1; j < tokens.length; i+=2, j+=2 ) { var lat : Number = Number(tokens[i]); var lon : Number = Number(tokens[j]); path.push( new MapPoint( lon, lat) ); } return new Polygon([path]); }}} class SingletonEnforcer { } package、import、class、public、private、static、const,就像设计一个Java Util类,相比js库如ext、dojo,flex对ECMAScript 262规范脚本封装的更为完美,丝毫感觉不到是在用脚本语言进行编程。parseGeoRSSPoint从GeoRSS资源中获取点状要素,parseGeoRSSPolygon从GeoRSS资源中获取面状要素,从这些代码中我们可以学习到GEORSS、GEOWGS、GEO、GML的解析方法。
本文转自Flyingis博客园博客,原文链接:http://www.cnblogs.com/flyingis/archive/2008/12/09/1350778.html,如需转载请自行联系原作者