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

相关文章
|
19天前
|
JSON API 开发者
1688 快递费用 API 接口的技术剖析与应用
1688快递费用API接口为企业和开发者提供自动化、高效化的快递费用查询服务,打破人工查询的繁琐局面。通过输入寄件与收件地址、商品重量、体积及选择快递公司等信息,接口精准计算费用并返回结果,支持中通、圆通等主流快递。输出内容包括快递费用、预估时效及附加费说明,助力电商精细化运营。Python示例代码展示了如何使用requests库发起POST请求并解析响应数据,实现费用查询自动化。
63 10
|
25天前
|
人工智能 自然语言处理 API
解锁 DeepSeek API 接口:构建智能应用的技术密钥
在数字化时代,智能应用蓬勃发展,DeepSeek API 作为关键技术之一,提供了强大的自然语言处理能力。本文详细介绍 DeepSeek API,并通过 Python 请求示例帮助开发者快速上手。DeepSeek API 支持文本生成、问答系统、情感分析和文本分类等功能,具备高度灵活性和可扩展性,适用于多种场景。示例展示了如何使用 Python 调用 API 生成关于“人工智能在医疗领域的应用”的短文。供稿者:Taobaoapi2014。
|
19天前
|
存储 自然语言处理 监控
深度解析淘宝商品评论API接口:技术实现与应用实践
淘宝商品评论API接口是电商数据驱动的核心工具,帮助开发者高效获取用户评价、画像及市场趋势。其核心功能包括多维度信息采集、筛选排序、动态更新、OAuth 2.0认证和兼容多种请求方式。通过该接口,开发者可进行商品优化、竞品分析、舆情监控等。本文详细解析其技术原理、实战应用及挑战应对策略,助力开启数据驱动的电商运营新篇章。
|
6月前
|
缓存 监控 API
淘宝 API 接口使用的技术要点与注意事项
在数字化商业环境中,淘宝API为开发者提供了强大的工具,用于与淘宝平台交互,获取商品信息及处理交易等。本文总结了正确使用API的关键技术要点:注册认证、理解接口文档、遵守调用限制、确保参数准确性、保护数据安全、处理异常、性能优化、版本兼容、合规性及日志监控,帮助开发者实现高效、安全的程序开发。
|
6月前
|
监控 安全 测试技术
深入理解后端技术中的API设计原则
在当今数字化时代,后端技术已成为构建高效、可扩展和安全应用程序的关键因素。本文将探讨后端开发中的API设计原则,包括RESTful架构、版本控制以及安全性等方面,旨在帮助开发者提升API设计的质量和用户体验。通过对这些原则的深入理解,可以更好地满足业务需求并提高系统的可靠性。
96 0
|
2月前
|
XML 算法 API
通过亚马逊产品广告API获取国际商品详情的技术实现
本文详细介绍如何通过亚马逊产品广告API获取国际商品信息。首先,需注册亚马逊联盟账户并申请API访问权限,获取AWS Access Key ID等凭证。接着,解析API端点和服务,如ItemLookup和ItemSearch。然后,构建API请求,包括URL、参数设置及签名生成。以Python为例,使用requests或boto3库实现API调用,并处理XML格式的API响应。最后,注意API速率限制、区域设置、数据更新及错误处理。参考官方文档确保调用准确性和安全性。
|
3月前
|
JSON 搜索推荐 API
拍立淘API是基于图像识别技术的服务接口,支持淘宝、1688和义乌购平台。
拍立淘API是基于图像识别技术的服务接口,支持淘宝、1688和义乌购平台。用户上传图片后,系统能快速匹配相似商品,提供精准搜索结果,并根据用户历史推荐个性化商品,简化购物流程。开发者需注册账号并获取API Key,授权权限后调用接口,返回商品详细信息如ID、标题、价格等。使用时需遵守频率限制,确保图片质量,保障数据安全。
|
5月前
|
安全 物联网 API
API技术之身份认证
【10月更文挑战第17天】身份认证是API安全的核心,确保API可信可控。
API技术之身份认证
|
5月前
|
JSON 前端开发 测试技术
API接口 |产品经理一定要懂的10%技术知识
作为产品经理,掌握约10%的技术知识对处理API相关工作至关重要。这包括理解API的基本概念及其作为数据交换的桥梁作用;熟悉JSON和XML两种主要数据格式及其特点;了解常见HTTP请求方法(GET、POST、PUT、DELETE)及响应状态码;关注API安全性,如认证授权和数据加密;掌握API版本管理和错误处理技巧;重视性能优化,以提升用户体验;参与API联调测试,确保稳定可靠;并与前后端团队紧密协作,选择合适的第三方API服务,推动产品高效开发。
|
6月前
|
缓存 测试技术 API
电商平台 API 接入技术要点深度剖析
本文介绍了高效使用电商平台API的关键步骤。首先,深入理解API文档,明确功能权限与参数格式要求;其次,选择合适的接入方式,如HTTP/HTTPS协议和RESTful API;接着,实施身份验证与授权机制,确保数据安全传输;此外,还需关注性能优化、安全防护、监控与日志记录,以提升系统稳定性和响应速度;最后,进行充分测试与调试,并关注API版本更新,确保长期兼容性。