AS3 如何在没有可怕的 "Conflict Exists" 错误的情况下声明一个对象?

AS3 How to declare an object without the dreaded "Conflict Exists" error?

我正在用 Flash 设计一个简单的游戏,遇到了这个错误。我不知道如何在 actionscript 中解决这个问题,希望得到任何帮助。

基本上,我有一个 switch 语句,它根据每种情况创建一个不同类型的对象(因为我不想为每种情况重复相同的十行代码)并且我得到 "conflict exists with definition in namespace internal" 编译器错误,我想我明白为什么了。

switch(power){
    case 1:
        var Pow:objectOne = new objectOne();
        break;
    case 2:
        var Pow:objectTwo = new objectTwo();
        break;
}

然而我的问题是 - 正确的处理方式是什么?

我最初想在导致 "implicit coercion of a value of type object(One/Two) to an unrelated type Class" 错误的 switch 语句之前声明变量。我在这里错过了什么?

免责声明:我的 AS3 有点生锈了 ;)

变量 Pow 在 switch 语句之后 是什么类型? objectOne 还是 objectTwo?从编译器的角度来看,objectOneobjectTwo 可能完全不同(阅读:方法、字段...)

所以:
A) 保留两个赋值的变量名,但在 switch 语句之前声明它并使用通用的基本类型 (object, MovieClip,...)
B) 有 2 个不同的变量:var PowOne: objectOnevar PowTwo: objectTwo

我认为选项 A 更可取...

除了您遇到的编译器错误之外,这里的另一个问题是您计划稍后在代码中使用 pow 变量,但它们属于不同类型。我的建议是利用 OOP 中继承的好处,并创建一个基础 class,您的两个自定义 classes 可以从中继承。这样它们在技术上都是相同的基本类型,同时仍然让您可以自由定制每个自定义 class,同时在基本 class.

中保持相似的功能

请记住,OOP 总是在这里为您提供帮助,并且可以避免您遇到的问题,但这是我的做法,我在 Flash CC 2014 中测试了以下实现并编译成功:

示例.FLA:

var pow:BaseClass;
var power = 1;

switch(power){
    case 1:
        pow = new ObjectOne();
        break;
    case 2:
        pow = new ObjectTwo();
        break;
}

pow.whichObjectAmI();    // this will simply trace what object pow is

基础Class

package  {

    public class BaseClass {

        public function BaseClass() {
            // constructor code
        }

        public function whichObjectAmI() {
            trace("I am the base class");
        }

    }

}

对象一

package  {

    public class ObjectOne extends BaseClass {

        public function ObjectOne() {
            // constructor code
        }

        override public function whichObjectAmI() {
            trace("I am Object One!");
        }

    }

}

对象二

package  {

    public class ObjectTwo extends BaseClass {

        public function ObjectTwo() {
            // constructor code
        }

        override public function whichObjectAmI() {
            trace("I am Object Two!");
        }

    }

}

您始终可以继承任何 ActionScript 的 classes 以及 MovieClip、Button 等。通过这样做,您将在它们的功能之上添加自定义功能,因此 1) 您不需要不必重新构建一堆功能,并且 2) 让您有机会在添加自己的自定义代码的同时重用它们的功能!