AS3 超级 Class 问题

AS3 Super Class Issue

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

场景:

我有一个名为 'food' 的超级 Class,我有 20 种不同的食物并扩展 'food',如披萨、咖喱、鱼和薯条等。

当我删除 'food' 时,我会保留它的记录以便我可以重复使用(出于性能目的)。我可以用旧的 'food' 制作新的披萨 class 吗?

例如

public class Pizza extends food
{
      public function Pizza()
      {
           super = FOOD.returnUsedFoodClass();
      }
}

这可能吗,或者我是否也需要保存扩展 Class?

希望这一切都有意义。

编辑:

当我说删除时,我的意思是我不再需要它 - 所以我通常会删除所有对它的引用。但是,我将不再需要的所有 'food' class 都放在一个静态向量中,以便以后可以重用它们。

你误解了这里的基本 OOP 原则。

首先:构造函数 运行 仅在创建对象时出现一次,因此任何停止创建对象或从其构造函数中替换对象的尝试都是不合逻辑的,并且不会成功,因为对象在那一刻已经创建。

其二:对super关键字的经典误解。没有 super 不指向任何其他对象的任何其他实例,构造函数中的 super 指向构造函数的 super class 实现。试图将对象分配给 super 是行不通的,也是不合逻辑的。我猜你打算使用 'this' 无论如何也行不通。

你试图实现的目标不能用任何 OOP 语言那样完成。没有办法 运行 一个构造函数(意味着创建对象)并使这个对象指向它自己的构造函数中的其他东西。您正在寻找的是一个通过静态方法的 classic 对象池系统,如下所示:

var pizza:Pizza = Food.getFood("pizza") as Pizza;

静态方法检查是否有任何 Pizza 实例(来自池)可用,如果可用,则 returns 可用,如果不可用,则创建一个新实例并 returns 它。

池化可以松散地实现,也可以显式地实现,我更喜欢更可靠、更灵活的显式版本。这是一个例子:

食物 class 合并增加:

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.

现在,当不再使用实例时,您可以调用实例 recycle() 方法将其放入回收站。然后,当您需要一个新实例时,您可以执行以下操作:

var food:Food = Food.getFood();

这在食物中就是这样实现的 class:

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 class 的后代,例如通过向 Food 添加类型成员变量并在返回它们之前检查回收实例的类型。