ArcGIS Flex API 中的 Flex 技术(二)--面向对象

简介:

面向对象的三大特性:继承、封装、多态,都可以在Flex开发中找到它们的身影,ArcGIS Flex API充分利用了Flex面向对象的语法机制进行了设计和扩展,前一篇谈到的事件就是继承了flash.events.Event,这篇文章将通过一个典型GeoRSS Demo分析Flex的面向对象。

    最基本的一个类封装:

复制代码
None.gif package com.esri.ags.samples
ExpandedBlockStart.gif
{
InBlock.gif   
InBlock.gif
public class Namespaces
ExpandedSubBlockStart.gif
{
InBlock.gif    
public static const RDF_NS:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
InBlock.gif    
public static const DC_NS:Namespace = new Namespace("http://purl.org/dc/elements/1.1/");
InBlock.gif    
public static const SY_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/syndication/");
InBlock.gif    
public static const CO_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/company/");
InBlock.gif    
public static const TI_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/textinput/");
InBlock.gif    
public static const RSS_NS:Namespace = new Namespace("http://purl.org/rss/1.0/< /span>");
InBlock.gif    
public static const ATOM_NS:Namespace = new Namespace("http://www.w3.org/2005/Atom");
InBlock.gif    
public static const ATOM_03_NS:Namespace = new Namespace("http://purl.org/atom/ns#");
InBlock.gif    
public static const XHTML_NS:Namespace = new Namespace("http://www.w3.org/1999/xhtml");
InBlock.gif    
public static const CONTENT_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/content/");
InBlock.gif    
public static const GEORSS_NS:Namespace = new Namespace("http://www.georss.org/georss");
InBlock.gif    
public static const GEOWGS_NS:Namespace = new Namespace("http://www.w3.org/2003/01/geo/wgs84_pos#");
InBlock.gif    
public static const GEO_NS:Namespace    = new Namespace("http://www.w3.org/2003/01/geo/");
InBlock.gif    
public static const GML_NS:Namespace    = new Namespace("http://www.opengis.net/gml");
InBlock.gif
InBlock.gif    
public function Namespaces(singletonEnforcer:SingletonEnforcer)
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
None.gif
class SingletonEnforcer
ExpandedBlockStart.gif
{
ExpandedBlockEnd.gif}
复制代码


    首先是Flex有package的概念,易于将类分类存放,并且可以避免命名相同的情况,其次public、class、static、const关键字都是我们非常熟悉的,它们的含义和常见OO语言的相同,代码申明了多个静态常量,存储RSS来源。

    Namespaces 类中有一个构造函数,和Java、C#相同,需要注意的是ActionScript不支持函数重载,最初这一点让大家不是很理解,但要知道,ActionScript和Javascript一样,都遵从ECMAScript 262规范,后面的同名函数会覆盖前面的,从另外一个角度去考虑,在as和js中,函数就是一个对象,同名的对象不可能同时存在于一个命名空间下,这点和 Java、C#有很大区别,所以要解决函数重载问题,要么使用不同名函数,要么通过一个参数去判断调用哪个函数。

    因此我们可以这样来设计多态:

复制代码
None.gif function doWithString(arg: string )
ExpandedBlockStart.gif
{
InBlock.gif    
return arg;
ExpandedBlockEnd.gif}

None.giffunction doWithInteger(arg:
int )
ExpandedBlockStart.gif
{
InBlock.gif    
return arg;
ExpandedBlockEnd.gif}
复制代码


    或者是:

复制代码
None.gif  style="color: #0000ff;">if  (arguments.length  ==   1 )
ExpandedBlockStart.gif
{
InBlock.gif    
if (arguments[0typeof 'String')
ExpandedSubBlockStart.gif    
{
InBlock.gif        doWithString(arg);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
if (arguments[0typeof 'Int')
ExpandedSubBlockStart.gif    
{
InBlock.gif        doWithInteger(arg);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
else   if  (arguments.length  ==   2 )
ExpandedBlockStart.gif
{
ExpandedBlockEnd.gif}
复制代码


    Flex继承采用了prototype原型,经过封装之后我们可以直接使用extends关键字实现常用继承功能:

None.gif public   class  GeoRSSProvider extends EventDispatcher
ExpandedBlockStart.gif
{
ExpandedBlockEnd.gif}


    可以发现,Flex在ECMAScript 262基础上还是做出了不少工作以支持常规面向对象的设计理念,开发者可以很方便的将OO思想应用到Flex之中,Flex里可以发现 Javascript、Java的身影,并加入了自己的一些语法习惯,例如变量类型或实例类型都放置在后面,和常规使用习惯稍有出入。

    再看GeoRSSUtil功能类,提供了一系列静态方法来解析资源中所提供的地理信息:

复制代码
None.gif package com.esri.ags.samples
ExpandedBlockStart.gif
{
InBlock.gif
InBlock.gifimport com.esri.ags.geometry.Geometry;
InBlock.gifimport com.esri.ags.geometry.MapPoint;
InBlock.gifimport com.esri.ags.geometry.Polygon;
InBlock.gif
InBlock.gifimport mx.utils.StringUtil;
InBlock.gif   
InBlock.gif
public class GeoRSSUtil
ExpandedSubBlockStart.gif
{
InBlock.gif    
private static const GEORSS : Namespace = Namespaces.GEORSS_NS;
InBlock.gif    
private static const GEOWGS : Namespace = Namespaces.GEOWGS_NS;
InBlock.gif    
private static const GEO : Namespace = Namespaces.GEO_NS;
InBlock.gif    
private static const GML : Namespace = Namespaces.GML_NS;
InBlock.gif    
InBlock.gif    
public function GeoRSSUtil(singletonEnforcer:SingletonEnforcer)
ExpandedSubBlockStart.gif    
{
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public static function toGeometry( x : XML ) : Geometry
ExpandedSubBlockStart.gif    
{
InBlock.gif        
const geoLat : String = String(x.GEOWGS::lat );
InBlock.gif        
const geoLon : String = String(x.GEOWGS::long );
InBlock.gif        
if( geoLat && geoLon )
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return new MapPoint( Number( geoLon ), Number( geoLat ));
ExpandedSubBlockEnd.gif        }

InBlock.gif       
InBlock.gif        
const georssPoint : String = String(x.GEORSS::point);
InBlock.gif        
if( georssPoint )
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return parseGeoRSSPoint(georssPoint);
ExpandedSubBlockEnd.gif        }

InBlock.gif       
InBlock.gif        
const pointList : XMLList = x.GEO::point;
InBlock.gif        
if( pointList && pointList.length() > 0 )
ExpandedSubBlockStart.gif        
{
InBlock.gif            
const geoPoint : XML = pointList[0];
InBlock.gif            
const geoPLat : Number = Number(geoPoint.GEO::lat);
InBlock.gif            
const geoPLon : Number = Number(geoPoint.GEO::long);
InBlock.gif            
return new MapPoint( geoPLon, geoPLat );
ExpandedSubBlockEnd.gif        }

InBlock.gif       
InBlock.gif        
const georssPolygon : String = String(x.GEORSS::polygon);
InBlock.gif        
if( georssPolygon )
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return parseGeoRSSPolygon( georssPolygon);
ExpandedSubBlockEnd.gif        }
       
InBlock.gif               
InBlock.gif        
const whereList : XMLList = x.GEORSS::where;
InBlock.gif        
if( whereList && whereList.length() > 0 )
ExpandedSubBlockStart.gif        
{
InBlock.gif            
const pos : String = whereList[0].GML::Point[0].GML::pos[0];
InBlock.gif            
const arr : Array = pos.split(" ");
InBlock.gif            
const gmlLat : Number = Number(arr[0]);
InBlock.gif            
const gmlLon : Number = Number(arr[1]);
InBlock.gif            
return new MapPoint( gmlLon, gmlLat );
ExpandedSubBlockEnd.gif        }
                       
InBlock.gif        
return null;
ExpandedSubBlockEnd.gif    }

InBlock.gif   
InBlock.gif    
private static function parseGeoRSSWhere( x : XML ) : Geometry
ExpandedSubBlockStart.gif    
{
InBlock.gif        
return null;
ExpandedSubBlockEnd.gif    }

InBlock.gif   
InBlock.gif    
private static function parseGeoRSSPoint( text : String ) : Geometry
ExpandedSubBlockStart.gif    
{
InBlock.gif        
const tokens : Array = StringUtil.trim(text).split(" ");
InBlock.gif        
const lat : Number = Number(tokens[0]);
InBlock.gif        
const lon : Number = Number(tokens[1]);
InBlock.gif        
return new MapPoint( lon, lat);        
ExpandedSubBlockEnd.gif    }

InBlock.gif   
InBlock.gif    
private static function parseGeoRSSPolygon( text : String ) : Geometry
ExpandedSubBlockStart.gif    
{
InBlock.gif        
const path : Array = [];
InBlock.gif        
const tokens : Array = StringUtil.trim(text).split(" ");
InBlock.gif        
for( var i:int=0, j:int=1; j < tokens.length; i+=2, j+=2 )
ExpandedSubBlockStart.gif        
{
InBlock.gif            var lat : Number 
= Number(tokens[i]);
InBlock.gif            var lon : Number 
= Number(tokens[j]);
InBlock.gif            path.push( 
new MapPoint( lon, lat) );  
ExpandedSubBlockEnd.gif        }

InBlock.gif        
return new Polygon([path]);
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
None.gif
class  SingletonEnforcer
ExpandedBlockStart.gif
{   
ExpandedBlockEnd.gif}
复制代码


    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,如需转载请自行联系原作者

相关文章
|
2月前
|
Java Unix 关系型数据库
时间API在更新,传奇已经谢幕,但技术永远不死
时间API在更新,传奇已经谢幕,但技术永远不死
38 1
|
2月前
|
数据采集 传感器 人工智能
大数据关键技术之电商API接口接入数据采集发展趋势
本文从数据采集场景、数据采集系统、数据采集技术方面阐述数据采集的发展趋势。 01 数据采集场景的发展趋势 作为大数据和人工智能工程的源头,数据采集的场景伴随着应用场景的发展而变化,以下是数据采集场景的发展趋势。
|
2月前
|
IDE Java API
使用Java Web技术构建RESTful API的实践指南
使用Java Web技术构建RESTful API的实践指南
137 0
|
2月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
118 0
|
6天前
|
人工智能 自然语言处理 API
深度融合与创新:Open API技术促进AI服务生态构建
【7月更文第21天】在数字化转型的浪潮中,人工智能(AI)已从概念探索走向实际应用,深刻改变着各行各业。Open API(开放应用程序接口)作为连接技术与业务的桥梁,正成为推动AI服务普及和生态构建的关键力量。本文将探讨Open API技术如何通过标准化、易用性和灵活性,加速AI服务的集成与创新,构建一个更加丰富多元的AI服务生态系统。
31 2
|
6天前
|
存储 JSON 安全
OAuth2与JWT在API安全中的角色:技术深度解析
【7月更文挑战第20天】OAuth2和JWT作为两种重要的安全协议,在API安全中发挥着不可或缺的作用。OAuth2通过提供灵活的授权框架,实现了对资源的细粒度访问控制;而JWT则通过其紧凑性和自包含性,确保了身份验证和信息传输的安全性。在实际应用中,将OAuth2和JWT结合使用,可以构建出既强大又安全的API服务,为用户提供更加安全、可靠和便捷的数字体验。
|
29天前
|
JSON 数据可视化 API
技术心得:如何用Python和API收集与分析网络数据?
技术心得:如何用Python和API收集与分析网络数据?
25 2
|
8天前
|
监控 Kubernetes 数据可视化
API关键技术-日志审计技术
【7月更文挑战第19天】日志审计的目的是通过审计策略和日志分析,发现系统在某一时间段内发生的异常事件,通过事件关联和追溯,分析与事件相关联的内外部人员、系统、事件涉及的范围等。
|
23天前
|
数据采集 自然语言处理 算法
淘宝评论的 API 接口获取:技术探索与应用
这篇文稿探讨了淘宝评论API在数据驱动的商业环境中的重要性。API接口使得高效、精准地获取淘宝评论成为可能,帮助企业分析消费者反馈、优化产品和服务,以及训练智能算法。通过API,商家能实时监控评论以快速响应市场变化,同时确保数据合规性和安全性。然而,获取和使用数据涉及复杂的接口调用、数据清洗、反爬虫机制应对等挑战。通过实际案例,展示了API如何促进产品优化、市场研究和智能客服改进。随着技术发展,未来将有更多创新应用,但也需面对更严格的法规监管。
|
29天前
|
域名解析 JavaScript 网络协议
技术心得记录:如何使用google地图的api(整理)
技术心得记录:如何使用google地图的api(整理)
52 0