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

简介:

面向对象的三大特性:继承、封装、多态,都可以在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[0typeof 'String')
    
{
        doWithString(arg);
    }

    
if (arguments[0typeof '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,如需转载请自行联系原作者

相关文章
|
10月前
|
JSON API 数据格式
亚马逊商品评论API接口技术指南
亚马逊商品评论API可程序化获取指定ASIN商品的用户评价,包含评分、内容、时间等结构化数据。需企业认证并遵守使用协议,日调用上限500次。支持分页与排序查询,适用于竞品分析、口碑监测等场景,结合SP-API可构建完整电商数据方案。(238字)
|
10月前
|
JSON 缓存 算法
如何通过API获取1688商品类目数据:技术实现指南
1688开放平台提供alibaba.category.get接口,支持获取全量商品类目树。RESTful架构,返回JSON数据,含类目ID、名称、层级等信息。需注册账号、创建应用并授权。请求需签名认证,QPS限10次,建议缓存更新周期≥24小时。
|
11月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
10月前
|
JSON 算法 API
1688比价API接口:实现商品价格高效比较的技术指南
本文介绍1688比价API的核心功能与实战应用,涵盖接口调用、Python代码实现及价格比较算法优化。助您快速集成商品比价功能,提升电商开发效率。
1353 3
|
10月前
|
JSON 安全 API
淘宝天猫上货API接口技术指南
本文介绍淘宝天猫上货API,详解其RESTful接口原理、认证流程及Python调用示例。涵盖商品添加、签名生成、响应处理,并提供代码实现与最佳实践,助力开发者高效实现自动化批量上架。
1081 3
|
10月前
|
JSON 搜索推荐 API
拼多多商品详情API技术指南
拼多多商品详情API(pdd.goods.detail.get)支持通过商品ID获取商品标题、价格、销量、图片、库存及评价等详细信息,适用于电商数据分析、竞品监控与价格策略优化,返回标准JSON格式,便于集成开发。
1377 1
|
10月前
|
缓存 数据可视化 定位技术
快递鸟快递API技术指南:获取物流轨迹信息与轨迹地图的解决方案
在当今电商竞争激烈的环境中,物流体验已成为提升用户满意度的关键因素。研究表明,超过 75% 的消费者会因物流信息不透明而放弃下单。
2101 1
|
10月前
|
JSON 安全 API
1688批量上货API接口技术指南
本文介绍1688批量上货API的集成与使用,涵盖认证、请求构建及错误处理。通过Python示例代码,助您实现商品信息批量上传,提升电商运营效率。
|
10月前
|
存储 缓存 算法
淘宝买家秀 API 深度开发:多模态内容解析与合规推荐技术拆解
本文详解淘宝买家秀接口(taobao.reviews.get)的合规调用、数据标准化与智能推荐全链路方案。涵盖权限申请、多模态数据清洗、情感分析、混合推荐模型及缓存优化,助力开发者提升审核效率60%、商品转化率增长28%,实现UGC数据高效变现。
|
11月前
|
供应链 安全 API
唯品会:利用银行转账API实现企业采购对公支付的技术实践
企业采购支付面临合规、效率与对账难题。唯品会通过银行API实现银企直连,构建安全高效对公支付系统,支持ISO 20022标准与多重风控,支付耗时从72小时降至90秒,错误率下降98%,推动供应链数字化升级。(236字)