如何在ActionScript 3中覆盖常量

时间:2012-10-05 06:28:11

标签: actionscript-3 flash flex

我有以下两个课程:

public class Parent{
    static internal const _name:String = "Parent";

    public function get name():String{
        return _name;
    }
}

public class Child{
    static internal const _name:String = "Child";
}

如果我创建一个类Child的实例并调用它的name()getter,因为它将调用它从Parent继承的name()方法,它返回“Parent”。当然,我可以覆盖name()方法:

public class Child{
    static internal const _name:String = "Child";

    override public function get name():String{
        return _name;
    }
}

返回“Child”。但是,从父级复制完全相同的方法代码似乎很愚蠢。有没有更简单的方法呢?

5 个答案:

答案 0 :(得分:1)

我会采用不同的方法,将“name”属性作为父级构造函数的要求:

public class Parent
{
    static internal var _name : String;

    public function Parent(name : String = "Parent") {
        _name = name;
    }

    public function get name() : String {
        return _name;
    }
}

儿童班:

public class Child extends Parent
{   
    public function Child() {
        super("Child");
    }
}

答案 1 :(得分:1)

你的get name的实现应该是这样的,然后getter是一个,每个新类需要来定义它自己的 public static var _name:< / p>

//in the base class
    public function get name():String 
    {
        var _sName:String;
        if ((this as Object).constructor._name)
        {
            _sName = (this as Object).constructor._name; 
        }
        else
        {
            try
            {
                var o:Object = getSuperClass(this);
                while (o)
                {
                    if (o._name)
                    {
                        _sName = o._name;
                        break;
                    }
                    o =  getSuperClass(o);
                }
            }
            catch (e:*)
            {}
        }
        return _sName;
    }
//as found here: http://www.actionscriptdeveloper.co.uk/getting-the-class-of-an-object-in-as3/
public static function getSuperClass(o: Object): Object
{
    var n: String = getQualifiedSuperclassName(o);
    if (n == null)
        return(null);

    return getDefinitionByName(n);
}

静态成员只能通过我们可以从构造函数对象获取的类引用来访问,“this”将指向继承链中的当前类,因此您可以在父类中调用它,它将指向一个Child in一个儿童班。

<强> [编辑] 我修改了它,所以它测试是否存在公共静态属性_name,如果在“this”实例上找不到,那么在循环中检查父类直到找到一个 - 比如继承:)

我正在使用此功能创建克隆方法:constructor as helper in clone method implementation

最好的问候

答案 2 :(得分:1)

首先,你不能覆盖静态方法或属性 - 它们不会被继承,所以不能覆盖它们。

其次,如果您将常量声明为复数类型,则它实际上不是常数。即如果是对象,则可以更改其键/值,如果是数组,则可以添加/删除成员等。

但是,使这个功能更通用的愿望是可以理解的。那么,我要做的是:

在父母和孩子之外有一些财产,比如在课程X或包Y。让它成为包Y。所以,你要在包Y中创建一个字典,让它成为Y.names并以你的名义获取你的名字:

import Y.names;
. . .
public function get name() {
    return names[(this as Object).constructor];
}

你的名字变量是:

package Y {

    public var names:Dictionary = generateNames();

    internal function generateNames():Dictionary {
        var result:Dictionary = new Dictionary();
        result[ChildClass] = "child";
        result[ParentClass] = "parent";
        . . .
        return result;
    }
}

这样只在超类中实现名称getter就足够了,所有继承类都可以按原样使用超类代码,不需要改变任何东西。但是,这意味着与此类相关的一些(可能是重要的)信息将存储在其他地方(可能很难找到,这不是人们在AS3中编程的常见方式)。

答案 3 :(得分:1)

为什么不在相应的函数中存储这样的常量而不是声明一个不可访问的常量?

class Parent {
    ...
    public function get name():String { return 'Parent'; }
}
class Child extends Parent {
    ...
    override public function get name():String { return 'Child'; }
}

顺便说一句,如果你的Parent类是DisplayObject的后代,你应该小心使用name属性,因为有时需要操作代码,例如: getChildByName()

答案 4 :(得分:0)

我找到了似乎有用的东西。非常感谢任何反馈:

public class Parent{
    prototype._name = "Parent";

    public function get name():String{
        return this["_name"];
    }
}

public class Child{
    prototype._name = "Child";
}