Jeff’s Weblog

Blog my life

This blog is no longer be updated 七月 18, 2008

类归于: life — Jeff @ 5:02 下午

Because the GFW, I can’t access this blog without proxy. By using proxy the speed is extremely slow, so I decided to close this blog.

But I create anohter blog with my own domain name and all resources here successfully moving to that site. So welcome to http://blog.jeffxu.cn !!

因为GFW我不能正常的访问这个blog,这篇文章是通过代理来完成的,但是速度极其的慢,所以我把这个blog的内容转移到我现在的blog中去,并且这个blog不再继续更新。

欢迎访问 http://blog.jeffxu.cn !!

 

决定练字 十月 21, 2007

类归于: life — Jeff @ 8:35 下午

自从毕业之后就很少在纸上写字,偶尔写两个字发觉好像某些字要想一下才写的出来,而且字写的歪歪扭扭,所以决定,今天开始练字,每天抄晚报一段报道,来保持“正常”。

哎,有点无奈啊。。。

 

国庆期间拍的一些照片 十月 10, 2007

类归于: photo — Jeff @ 12:51 下午

最近新买了个相机 佳能A720IS 特地趁国庆期间在上海的一些景点拍了些照片:

夜景

日景

 

不知是AsWing的bug还是AsWing GUIBuilder的问题 九月 29, 2007

类归于: aswing — Jeff @ 10:17 上午

今天早上乘着空隙,试用了一下AGB beta版,如下图:

(布局用的是borderLayout,5个Panel分别放在west,south,north,center,east)

在向底部蓝色部分添加label的时候,问题出现了,如下图:

(注意下面的蓝色部分)

按了AGB上的revalidate几次也没变化,重新打开后就一切正常了。。。

我个人认为AGB的预览效果只是根据用户对组件组织结构和参数调用了相应的AsWing类,AGB只是起到组织和生成代码的作用,显示上的问题应该是AsWing本身的问题,惭愧还没机会研究AsWing和AGB源代码,只能在这里猜测:((希望这对AsWing团队有些帮助:))

 

Test From Airpress 九月 26, 2007

类归于: life — Jeff @ 2:54 下午

Wow yet another great air application Airpress!This post is edit and published by Airppress as a test.But the internationalization is not good enough that it doesn’t support Chinese.

Waiting for the next update!

 

推荐的一些AsWing教程 八月 28, 2007

类归于: actionscript, aswing — Jeff @ 5:22 下午

AsWingHarry介绍给我的(鼎力推荐:”)),它是一个开源的flash框架也是OSFlash上的一个子项目,它的结构是模仿Java Swing,如果你对Java Swing很熟的话那用起AsWing一定很容易上手的:)。最重要的一点是,这个框架大部分是我们国人iiley写的,非常佩服他,敢想敢干!AsWing一个特点是可以让我们用纯代码来构造一系列的界面,而且它的体积非常小。最近听Harry说他们正在开发一种客户端缓存组件的技术(只限AS3)叫Flash DLL,据介绍可以把swf大小剪掉90%以上,因为是开源的你也能定制自己的共享库缓存端。相比之下AS3版本的AsWing要比AS2的在效率方面要快许多(因为我只用过AS3版本没有亲身经历过到底有多大的不同,但是依靠FlashPlayer和AVM2性能的提升相信也是无需置疑的,呵呵)。

下面来介绍一些AsWing的教程:

AsWing主页:http://www.aswing.org 不过上面都是英文(面向世界),可能英文不好的朋友看起来有点吃力。

胡矿AsWing教程的blog:http://thiswind.flashseer.org 这个blog从头到尾都是胡矿写的AsWing教程而且是全中文的弥补了缺乏中文教程的不足:),非常的不错,你可能在学习Aswing的同时对AS3也有很大的提高。

Harry的blog:http://harryxu.cn/blog Harry会在他的blog上时不时的发一些他写的AsWing教程,有浅有深,如基本的组件使用,但也有像在使用AsWing时碰到的问题和解决的总结、AsWing一些bug之类的有深度的文章!

Java Swing教程:http://java.sun.com/docs/books/tutorial/uiswing/TOC.html 如我前面介绍的AsWing是模仿Swing的框架,所以一些组件的使用也可以借鉴现有的Java Swing教程:)

随着AsWing的使用越来越普及,一些有质量的教程会相继出现,我也会不断更新这个列表,当然可能其中也包括我的,我会把平时使用过程中遇到的问题和解决的方法都发表在未来的日志中,希望大家始终关注我的blog:)

cheers!

 

尽量使用接口而不是抽象类 八月 24, 2007

类归于: actionscript, oop — Jeff @ 4:44 下午

就像许多前辈都指出的“尽量使用接口而不是抽象类”,我从中有所感悟,用我前面举的抽象类的例子来解释一下如何用接口替换抽象类(专门写这篇,是想看看我是不是真正理解了-只有能表达出来的东西才算你真正理解,背诵不算:),呵呵)

不提倡使用抽象类的原因是因为你一旦继承了这个类就是这个类型了(被定义了一种语义),就像前面我举的关于内核的例子,你继承了AbstractBrowserCore,那么它就代表了一种浏览器的内核。因为不管java还是as它们都是单继承的,也就是只有一个父类,父类的定义显然是很宝贵的,不能随随便便的来定义。
我在前面的例子上再举个例子:
像FF和IE都提供了很多不错的插件(ActiveX),这么好的资源不能浪费啊!!!我决定不只是利用其它浏览器的内核,它们的插件我也要!还有其它功能(如书签什么的),我准备把它作成服务。
这些服务包括:
使用其它浏览器的内核,使用浏览器插件,得到浏览器书签等等。

上面每个功能我都用接口来定义:

interface IBrowse

{

function browse(url:String):String;

function back():void;

function forward():void;

function home():void;

}

interface IPlugin

{

function getPlugins():Array;

function invoke(plugin:Object):Boolean;

}

interface IBookmark

{

function addBookmark(b:Object):void;
function getBookmarks():Array;

}

我用一个FFBrowserService来实现前面定义的所有接口(只用FF来举例):

public class FFBrowserService implements IBrowse, IPlugin, IBookmark

{

public ovarride function browse(url:String):String

{

// 调用FF的api

}

………

// 实现的所有接口方法

……….

}

使用 FFBrowserService类:

public class BrowserApp

{

private var _browserService:Object;

private var _bookmark:Array;

public function set browserService(bs:Object):void

{this._browserService = bs;}

public function init()

{

if(this._browser is IBookmark)

{

var bm:IBookmark = this._browserService as IBookmark;

this._bookmark = bm.getBookmarks();

}

}

public function onBackBtRelease():void

{

if(this._browserService is IBrowse == false) return;

var b:IBrowse = this._browserService as IBrowse;

b.back();

}

public function onEnterRelease():void

{

if(this._browserService is IBrowse == false) return;

var b:IBroser = this._browserService as IBrowse;

checkStatus(b.browse(inputText.text)); //检查http状态

}

public function pluginOnRelease(pl:Object):void

{

if(this._browserService is IPlugin == false) return;

var p:IPlugin = this._browserService as IPlugin;

p.invoke(pl);

}

}

像这样用接口而不是用抽象类是不是觉得更加的灵活呢?假设一种浏览器不支持插件,那么可以不用实现IPlugin这个接口。而从语义上来讲,FFBrowserService这个类代表了整个第三方浏览器所提供的服务,而不仅仅是内核而已。

希望我的理解对你有所帮助:)

 

抽象类简单介绍 八月 24, 2007

类归于: actionscript, oop — Jeff @ 8:38 上午

抽象类就是不能实例化的类,因为它内部的一些抽象方法还没有被实现(你不可能去创建一个连方法内容都没有的类的对象)。
它的作用是,把一些子类共有的方法全部集中在父类(也就是这个抽象类)中,但它还提供一些抽象方法(所谓抽象方法就是没有实现的方法只是声明了一下方法名和参数)子类一定要去实现它们。
问题就在,为什么它要提供这些抽象方法?为什么它自己不实现这些方法?
我简单举个例子,比如说:
我觉得现在的一些浏览器的功能不能满足我,我想做个浏览器自己实现了一些功能,但是浏览器的内核我没有能力来写(能写出来我就是高手啦,哈哈),所以我想调用其它现有浏览器的内核(就像the world做的那样),但是我想做的比它还好,因为the world只能用IE内核,我想IE和firefox的内核都能用(可能还有其它的内核),觉得IE好的用IE内核,觉得FF好的用FF的内核,根据用户的爱好设定。
其它功能部分我都实现了,为了满足我前面的需求我建了一个抽象类:
import flash.errors.IllegalOperationError;
public class AbstractBrowserCore
{
……..
public function someOtherCommonFunction(){….} //一些非抽象公共函数
………
// 抽象方法
public function browse(url:String):String
{throw new IllegalOperationError(”abstract function must be overriden”);}
}

// IE实现类
public class IEBrowserCore extends AbstractBrowserCore
{
override public function browse(url:String):String
{
// 调用IE的api
}
}

// FF实现类
public class FFBrowserCore extends AbstractBrowserCore
{
override public function browse(url:String):String
{
// 调用FF的api
}
}

// 未来浏览器内核的实现类
public class SomeOtherBrowserCore extends AbstractBrowserCore
{
override public function browse(url:String):String
{
// 调用其它浏览器内核的api
}
}

// 调用这些类
public class RunApp
{
private var bcore:AbstractBrowserCore;
public function set broswerCore(core:AbstractBrowserCore):void
{
this.bcore = core;
}

public function onKeyDownEvent(e:Event)
{
var code:String = this.bcore.browse(this.inputText.text);
if(code == 404) outputText.text(”文件未找到”);
else if…..
}
}
用户只要设置了他喜欢的内核就可以了,这就是多态的力量!可以随意更换实现,但是主程序更本就不需要有什么改变,就像FF的插件一样,非常灵活,来去自由,容易扩展。
其实像http就是一个非常抽象的协议,我们根本就不关心服务器的后台到底是什么,管它是jsp,php,asp,我们只要能看到我们想看到的就可以了。
不知道有没有解释清楚,呵呵:-)

 

AS3对Abstract Class的实现 八月 22, 2007

类归于: actionscript, oop — Jeff @ 10:11 上午

http://www.zeuslabs.us/2007/08/19/enforcing-abstract-classes-at-runtime-in-actionscript-3/

看了下他关于用AS3实现的Abstract Class,个人感觉这个实现有点麻烦而且有效率的损失。我试着自己写了一个Abstract Class实现:

抽象类:

package jeff.abstract
{
import flash.errors.IllegalOperationError;

public class MyAbstractClass
{

public function MyAbstractClass(self:MyAbstractClass)
{
if(self != this)
{
throw new IllegalOperationError(“Abstract class did not receive reference to self. MyAbstractClass cannot be instantiated directly.”);
}
}

public function mustBeOverriden1(param:String):void
{
throw new IllegalOperationError(“abstract function must be overriden”);
}

public function mustBeOverriden2(param:String):void
{
throw new IllegalOperationError(“abstract function must be overriden”);
}

}
}

实现类:

package jeff.abstract
{
public class MyImplementClass extends MyAbstractClass
{
public function MyImplementClass()
{
super(this);
}

public override function mustBeOverriden1(param:String):void
{
trace(“from or1 “+param);
}

public override function mustBeOverriden2(param:String):void
{
trace(“from or2 ” + param);
}
}
}

未实现抽象类中的方法的实现类:

package jeff.abstract
{
public class NotImplementAbstract extends MyAbstractClass
{
public function NotImplementAbstract()
{
super(this);
}
}
}

运行类:

package {
import flash.display.Sprite;
import jeff.abstract.MyAbstractClass;
import jeff.abstract.MyImplementClass;
import jeff.abstract.NoImplementAbstract;

public class AbstractTest extends Sprite
{
public function AbstractTest()
{
var a:MyAbstractClass = new MyImplementClass();
a.mustBeOverriden1(“hi”);
a.mustBeOverriden2(“world”);

// output: from or1 hi

from or2 world

var b:MyAbstractClass = new NotImplementAbstract();
b.mustBeOverriden1(“hi”);
b.mustBeOverriden2(“world”);

// throw exceptions

}
}
}
我只是在抽象类中要被抽象的方法中写了个异常抛出语句,意思就是如果你没有覆盖它的话,那么在运行的时候调用这个方法就会抛出异常(并不是像他那样在new的时候就检查是否覆盖了抽象方法)。如果对我这个实现有其它看法的话欢迎评论:)

 

BlogSpot又能访问了 八月 21, 2007

类归于: life — Jeff @ 10:51 下午

在网友的帮助下又能blogspot访问了,太好了:-)

http://hi.baidu.com/%C0%C7%CD%F5/blog/item/95bd7bf48aeb75d8f2d38595.html

参考他的方法就能访问了。如果你对设置代理不熟悉的话,另外一个网友对firefox和IE的代理设置做了详细的介绍:

http://www.williamlong.info/info/archives/184.html

上有政策,下有对策哈:)

我的blogspot地址是:http://jeffsbloger.blogspot.com/ 欢迎访问:P。