2

我有以下两个课程:

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;
    }
}

这将返回“孩子”。但是,必须从父级复制完全相同的方法代码似乎很愚蠢。有没有更简单的方法来做到这一点?

4

5 回答 5

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().

于 2012-10-05T10:52:30.743 回答
1

首先,您不能覆盖静态方法或属性 - 它们不是继承的,因此不能覆盖它们。

其次,如果您将常量声明为复杂类型,则它并不是真正的常量。即如果它是一个对象,那么你可以改变它的键/值,如果它是一个数组,你可以添加/删除成员等等。

但是让这个功能更通用的愿望是可以理解的。所以,我会做什么:

在父母和孩子之外都有一些财产,比如说在 classX或 package Y。让它成为包Y。所以,你会在 package 中创建一个字典Y,让它成为Y.names你的名字 getter,你会这样做:

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;
    }
}

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

于 2012-10-05T08:05:12.133 回答
1

您的 get name 实现应该如下所示,然后 getter 是一个,并且每个新类都需要定义自己的public static var _name:

//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”将指向继承链中的当前类,因此您可以在父类中调用 this,它将指向子类中的子类.

[编辑] 我已经对其进行了修改,因此如果在“this”实例上找不到公共静态属性_name,它会测试是否存在,然后在循环中检查父类,直到找到一个——比如继承:)

我正在使用此功能创建克隆方法:构造函数作为克隆方法实现中的助手

此致

于 2012-10-05T06:56:23.673 回答
1

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

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");
    }
}
于 2012-10-05T06:39:37.383 回答
0

我发现了一些似乎有效的东西。非常感谢任何反馈:

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

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

public class Child{
    prototype._name = "Child";
}
于 2012-10-05T07:50:12.097 回答