ActionScript 3 抽象类和抽象方法实现所需的工具类——Mims Wright

来源:互联网 发布:c语言编写函数绝对值 编辑:程序博客网 时间:2024/06/14 22:14

http://hi.baidu.com/hammerc/blog/item/f82925d7e792afcba144dfbd.html



在《殿堂之路》中黑羽给的网站已经下载不了,但是里面给出了源码,可以自己写成类进行使用。下面就将这些代码放上来,方便以后查找。

一共有三个类,分别是AbstractError ,strictIs,AbstractEnforcer

=====================第一个类AbstractError============================

package com.mimswright.errors
{

/**
* An error class used to ensure the correct behavior of asbsract classes.
*
* @author Mims Wright
*/
public class AbstractError extends Error
{
   /**
   * Use this error in the constructor for your abstract class.
   */
   public static const CONSTRUCTOR_ERROR:String="ERROR: An abstract class may not be instantiated.";

   /**
   * Use this error in abstract methods that should be overridden in your abstract class.
   */
   public static const METHOD_ERROR:String="ERROR: Failed to implement an abstract method.";


   public function AbstractError(message:String="", id:int=0)
   {
    super(message, id);
   }
}

}

=====================第二个类StrictIs===================================================

package com.mimswright.utils
{
import flash.utils.*;

/**
* Checks the class of <code>instance</code> against the <code>compareClass</code> for strict
* equality. If the classes are exactly the same, returns true. If
* the classes are different even if the <code>instance</code>'s class is a subclass
* of <code>compareClass</code>, it returns false.
* Does not work with interfaces. The compareClass must be a class.
*
* @author Mims Wright
*
* @example <listing version="3.0">
*                      var myBase:BaseClass = new BaseClass();
*                      var mySub:SubClass = new SubClass();
*                      trace(strictIs(myBase, BaseClass)); // true
*                      trace(strictIs(mySub, SubClass));       // true
*                      trace(strictIs(mySub, BaseClass));      // false
*                      </listing>
*
* @param instance - the object whos class you want to check.
* @param compareClass - the class to compare your object against.
* @return true if instance is strictly of type compareClass.
*/
public function strictIs(instance:Object, compareClass:Class):Boolean
{
   var instanceClass:Class=Class(getDefinitionByName(getQualifiedClassName(instance)));
   return instanceClass == compareClass;
}

}

=====================第三个类AbstractEnforcer======================================

package com.mimswright.utils
{
import com.mimswright.utils.strictIs;
import com.mimswright.errors.AbstractError;

public class AbstractEnforcer
{
   public static function enforceConstructor(instance:Object, className:Class):void
   {
    if (strictIs(instance, className))
    {
     throw(new AbstractError(AbstractError.CONSTRUCTOR_ERROR));
    }
   }

   public static function enforceMethod():void
   {
    throw(new AbstractError(AbstractError.METHOD_ERROR));
   }
}

}

使用方法:

package org.kingda.book.basicoop.abstractclassandinterface
{
import com.mimswright.utils.AbstractEnforcer;
public class AbstractFoo
{
   //抽象类的构造函数
   public function AbstractFoo() {
   AbstractEnforcer.enforceConstructor(this,AbstractFoo);
    //trace ("ok");
   }
   //抽象方法
   public function hello():void {
   AbstractEnforcer.enforceMethod();
    //trace ("hello()");
   }
}
}