Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3超级类问题_Actionscript 3_Superclass - Fatal编程技术网

Actionscript 3 AS3超级类问题

Actionscript 3 AS3超级类问题,actionscript-3,superclass,Actionscript 3,Superclass,我有一个问题,我不太确定最好的解决方法 情景: 我有一个叫做“食物”的超级班级,我有20种不同的食物,包括比萨饼、咖喱、鱼和薯条等 当我移除一个“食物”时,我会保留一个记录,这样我就可以重复使用(出于性能目的)。我可以用旧的“食物”制作一个新的比萨饼班吗 例如 这是可能的还是我也需要保存扩展类 希望这一切都有意义 编辑: 当我说remove时,我的意思是我不再需要它——所以我通常会删除对它的所有引用。但是,我将不再需要的所有“食物”类放在一个静态向量中,以便以后可以重用它们。您误解了OOP的基本

我有一个问题,我不太确定最好的解决方法

情景:

我有一个叫做“食物”的超级班级,我有20种不同的食物,包括比萨饼、咖喱、鱼和薯条等

当我移除一个“食物”时,我会保留一个记录,这样我就可以重复使用(出于性能目的)。我可以用旧的“食物”制作一个新的比萨饼班吗

例如

这是可能的还是我也需要保存扩展类

希望这一切都有意义

编辑:


当我说remove时,我的意思是我不再需要它——所以我通常会删除对它的所有引用。但是,我将不再需要的所有“食物”类放在一个静态向量中,以便以后可以重用它们。

您误解了OOP的基本原则

第一:构造函数只运行一次,并且仅在创建对象时运行,因此任何停止创建对象或从其构造函数中替换对象的尝试都是不合逻辑的,并且无法成功,因为此时的对象已经创建

第二:对超级关键词的经典误解。No super不指向任何其他对象的任何其他实例,super in构造函数指向构造函数的超类实现。尝试将对象分配给super无法工作,而且也是不合逻辑的。我猜你是想用“this”这个词,反正也不行

您试图实现的目标无法通过这种方式完成,而且在任何OOP语言中都是如此。无法运行构造函数(即创建对象)并使此对象指向其自身构造函数中的其他对象。您正在寻找的是一个通过以下静态方法实现的经典对象池系统:

var pizza:Pizza = Food.getFood("pizza") as Pizza;
其中,静态方法检查是否有任何Pizza实例(来自池)可用,如果是,则返回该实例,如果不是,则创建一个新实例并返回该实例

池可以松散地或显式地实现,我更喜欢更坚实、更灵活的显式版本。下面是一个例子:

食品级池添加:

static private var recycledInstances:Vector.<Food> = new Vector.<Food>();
//hold our reclycled instances

public function recycle():void
{
    var index:int = recycledInstances.indexOf(this);
    if(index >= 0)
    {
        return;
    }
    recycledInstances.push(this);
}
//explicitly add this instance to recycle

private function reset():void
{

}
//to run in constructor and when the instance is retreived from recycle
//this method purpose is to reset all values to default.
这在食品类中是这样实现的:

static public function getFood():Food
{
    if(recycledInstances.length)
    {
         var totalInstances:uint = recycledInstances.length;
         var instance:Food = recycledInstances[totalInstances - 1];
         instance.reset();
         recycledInstances.length -= 1;//faster than splice
         return instance;
    }
    return new Food();
}

例如,通过向food添加类型成员变量,并在返回实例之前检查回收实例的类型,您可以轻松地将其扩展到food类的后代。

您误解了这里的基本OOP原则

第一:构造函数只运行一次,并且仅在创建对象时运行,因此任何停止创建对象或从其构造函数中替换对象的尝试都是不合逻辑的,并且无法成功,因为此时的对象已经创建

第二:对超级关键词的经典误解。No super不指向任何其他对象的任何其他实例,super in构造函数指向构造函数的超类实现。尝试将对象分配给super无法工作,而且也是不合逻辑的。我猜你是想用“this”这个词,反正也不行

您试图实现的目标无法通过这种方式完成,而且在任何OOP语言中都是如此。无法运行构造函数(即创建对象)并使此对象指向其自身构造函数中的其他对象。您正在寻找的是一个通过以下静态方法实现的经典对象池系统:

var pizza:Pizza = Food.getFood("pizza") as Pizza;
其中,静态方法检查是否有任何Pizza实例(来自池)可用,如果是,则返回该实例,如果不是,则创建一个新实例并返回该实例

池可以松散地或显式地实现,我更喜欢更坚实、更灵活的显式版本。下面是一个例子:

食品级池添加:

static private var recycledInstances:Vector.<Food> = new Vector.<Food>();
//hold our reclycled instances

public function recycle():void
{
    var index:int = recycledInstances.indexOf(this);
    if(index >= 0)
    {
        return;
    }
    recycledInstances.push(this);
}
//explicitly add this instance to recycle

private function reset():void
{

}
//to run in constructor and when the instance is retreived from recycle
//this method purpose is to reset all values to default.
这在食品类中是这样实现的:

static public function getFood():Food
{
    if(recycledInstances.length)
    {
         var totalInstances:uint = recycledInstances.length;
         var instance:Food = recycledInstances[totalInstances - 1];
         instance.reset();
         recycledInstances.length -= 1;//faster than splice
         return instance;
    }
    return new Food();
}

例如,通过向food添加类型成员变量,可以轻松地将其扩展到food类的后代,并在返回它们之前检查回收实例的类型。

当您“移除食物”时,您的意思是什么?把食物从什么地方拿走?是否删除实际的类文件?你是否正在收集食物,并将其从收集中删除?我不确定我是否理解这个问题,但是
super.returnUsedClass()如何?@DodgerThud这可能吗?我快速尝试了一下,得到了“在……中找不到默认构造函数”@Kritner我已经更新了我的描述。对不起,我不太清楚如何解释我的问题。这是对OOP原则的一个明显的基本误解和基本的错误逻辑。根据定义,在任何OOP语言中,构造函数只运行一次,并且只在对象创建时运行。因此,试图停止对象创建并用构造函数中的内容替换它,从定义上讲是错误的,因为构造函数运行意味着对象已经创建。当你“移除食物”时,你是什么意思?把食物从什么地方拿走?是否删除实际的类文件?你是否正在收集食物,并将其从收集中删除?我不确定我是否理解这个问题,但是
super.returnUsedClass()如何?@DodgerThud这可能吗?我快速尝试了一下,得到了“在……中找不到默认构造函数”@Kritner我已经更新了我的描述。对不起,我不太清楚如何解释我的问题。这是对OOP原则的一个明显的基本误解和基本的错误逻辑。根据定义,在任何OOP语言中,构造函数只运行一次,并且只在对象创建时运行。因此,试图停止对象创建并用构造函数中的内容替换它,从定义上讲是错误的,因为构造函数运行意味着对象已经创建。感谢您的澄清,我确实误解了超类是如何实现的。我将使用您对我的静态池系统的建议,即var pizza:pizza=Food.getFood(“pizza”)作为pizza;谢谢你的帮助谢谢你的澄清,我确实误解了超级类是如何实现的。我将使用您对我的静态池系统的建议,即var pizza:pizza=Food.getFood(“pizza”)作为pizza;谢谢你的帮助