天天看點

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

面向對象的三大特性:繼承、封裝、多态,都可以在Flex開發中找到它們的身影,ArcGIS Flex API充分利用了Flex面向對象的文法機制進行了設計和擴充,前一篇談到的事件就是繼承了flash.events.Event,這篇文章将通過一個典型GeoRSS Demo分析Flex的面向對象。

    最基本的一個類封裝:

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

package com.esri.ags.samples

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

{

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

public class Namespaces

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const RDF_NS:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const DC_NS:Namespace = new Namespace("http://purl.org/dc/elements/1.1/");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const SY_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/syndication/");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const CO_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/company/");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const TI_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/textinput/");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const RSS_NS:Namespace = new Namespace("http://purl.org/rss/1.0/< /span>");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const ATOM_NS:Namespace = new Namespace("http://www.w3.org/2005/Atom");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const ATOM_03_NS:Namespace = new Namespace("http://purl.org/atom/ns#");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const XHTML_NS:Namespace = new Namespace("http://www.w3.org/1999/xhtml");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const CONTENT_NS:Namespace = new Namespace("http://purl.org/rss/1.0/modules/content/");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const GEORSS_NS:Namespace = new Namespace("http://www.georss.org/georss");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const GEOWGS_NS:Namespace = new Namespace("http://www.w3.org/2003/01/geo/wgs84_pos#");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const GEO_NS:Namespace    = new Namespace("http://www.w3.org/2003/01/geo/");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static const GML_NS:Namespace    = new Namespace("http://www.opengis.net/gml");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public function Namespaces(singletonEnforcer:SingletonEnforcer)

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    {

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    }

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

}

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

class SingletonEnforcer

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    首先是Flex有package的概念,易于将類分類存放,并且可以避免命名相同的情況,其次public、class、static、const關鍵字都是我們非常熟悉的,它們的含義和常見OO語言的相同,代碼申明了多個靜态常量,存儲RSS來源。

    Namespaces 類中有一個構造函數,和Java、C#相同,需要注意的是ActionScript不支援函數重載,最初這一點讓大家不是很了解,但要知道,ActionScript和Javascript一樣,都遵從ECMAScript 262規範,後面的同名函數會覆寫前面的,從另外一個角度去考慮,在as和js中,函數就是一個對象,同名的對象不可能同時存在于一個命名空間下,這點和 Java、C#有很大差別,是以要解決函數重載問題,要麼使用不同名函數,要麼通過一個參數去判斷調用哪個函數。

    是以我們可以這樣來設計多态:

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

function doWithString(arg:string)

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    return arg;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

function doWithInteger(arg:int)

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    或者是:

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

 style="color: #0000ff;">if (arguments.length == 1)

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    if (arguments[0] typeof 'String')

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        doWithString(arg);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    if (arguments[0] typeof 'Int')

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        doWithInteger(arg);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

else if (arguments.length == 2)

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    Flex繼承采用了prototype原型,經過封裝之後我們可以直接使用extends關鍵字實作常用繼承功能:

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

public class GeoRSSProvider extends EventDispatcher

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    可以發現,Flex在ECMAScript 262基礎上還是做出了不少工作以支援正常面向對象的設計理念,開發者可以很友善的将OO思想應用到Flex之中,Flex裡可以發現 Javascript、Java的身影,并加入了自己的一些文法習慣,例如變量類型或執行個體類型都放置在後面,和正常使用習慣稍有出入。

    再看GeoRSSUtil功能類,提供了一系列靜态方法來解析資源中所提供的地理資訊:

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

import com.esri.ags.geometry.Geometry;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

import com.esri.ags.geometry.MapPoint;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

import com.esri.ags.geometry.Polygon;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

import mx.utils.StringUtil;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

public class GeoRSSUtil

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    private static const GEORSS : Namespace = Namespaces.GEORSS_NS;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    private static const GEOWGS : Namespace = Namespaces.GEOWGS_NS;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    private static const GEO : Namespace = Namespaces.GEO_NS;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    private static const GML : Namespace = Namespaces.GML_NS;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public function GeoRSSUtil(singletonEnforcer:SingletonEnforcer)

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    public static function toGeometry( x : XML ) : Geometry

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const geoLat : String = String(x.GEOWGS::lat );

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const geoLon : String = String(x.GEOWGS::long );

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        if( geoLat && geoLon )

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        {

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            return new MapPoint( Number( geoLon ), Number( geoLat ));

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        }

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const georssPoint : String = String(x.GEORSS::point);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        if( georssPoint )

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            return parseGeoRSSPoint(georssPoint);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const pointList : XMLList = x.GEO::point;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        if( pointList && pointList.length() > 0 )

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            const geoPoint : XML = pointList[0];

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            const geoPLat : Number = Number(geoPoint.GEO::lat);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            const geoPLon : Number = Number(geoPoint.GEO::long);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            return new MapPoint( geoPLon, geoPLat );

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const georssPolygon : String = String(x.GEORSS::polygon);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        if( georssPolygon )

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            return parseGeoRSSPolygon( georssPolygon);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        }       

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const whereList : XMLList = x.GEORSS::where;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        if( whereList && whereList.length() > 0 )

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            const pos : String = whereList[0].GML::Point[0].GML::pos[0];

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            const arr : Array = pos.split(" ");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            const gmlLat : Number = Number(arr[0]);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            const gmlLon : Number = Number(arr[1]);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            return new MapPoint( gmlLon, gmlLat );

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        }                       

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        return null;

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    private static function parseGeoRSSWhere( x : XML ) : Geometry

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    private static function parseGeoRSSPoint( text : String ) : Geometry

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const tokens : Array = StringUtil.trim(text).split(" ");

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const lat : Number = Number(tokens[0]);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const lon : Number = Number(tokens[1]);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        return new MapPoint( lon, lat);        

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    private static function parseGeoRSSPolygon( text : String ) : Geometry

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        const path : Array = [];

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        for( var i:int=0, j:int=1; j < tokens.length; i+=2, j+=2 )

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            var lat : Number = Number(tokens[i]);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            var lon : Number = Number(tokens[j]);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象

            path.push( new MapPoint( lon, lat) );  

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

        return new Polygon([path]);

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

{   

ArcGIS Flex API 中的 Flex 技術(二)--面向對象
ArcGIS Flex API 中的 Flex 技術(二)--面向對象

    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,如需轉載請自行聯系原作者