我遇到了问题,我不太确定解决问题的最佳方法。
情景:
我有一个名为' food'我有20种不同的食物,并且延伸了食物和食物。比如披萨,咖喱,鱼和薯条等。
当我删除食物'我保留了它的记录,以便我可以重用(出于性能目的)。我可以制作一个使用旧食物的新比萨课吗?
E.g。
public class Pizza extends food
{
public function Pizza()
{
super = FOOD.returnUsedFoodClass();
}
}
这是可能的还是我还需要保存扩展类?
希望这一切都有意义。
编辑:
当我说删除时,我的意思是我不再需要它 - 所以我通常会删除对它的所有引用。但相反,我已经放置了所有的食物'我不再需要静态向量中的类,所以我可以在以后重用它们。
答案 0 :(得分:2)
你在这里误解了基本的OOP原则。
首先:构造函数只运行一次,并且只有在创建对象时,所以任何停止创建对象或从构造函数中替换对象的尝试都是不合逻辑的,并且由于此时已经创建了对象,因此无法成功。
第二:对super关键字的经典误解。没有超级没有指向任何其他对象的任何其他实例,超级构造函数指向构造函数的超类实现。试图将对象分配给超级无法工作,也是不合逻辑的。我猜你打算用这个'这个'无论如何也无法发挥作用。
你想要实现的目标不能用任何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.
现在,当不再使用实例时,请调用实例recycle()方法将其置于循环中。然后,当您需要新实例时:
var food:Food = Food.getFood();
这是在Food 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添加类型成员变量来轻松地将其扩展到食物类的后代,并在返回之前检查循环实例的类型。