AS3 Как объявить объект без страшной ошибки Conflict Exists?

Я разрабатываю простую игру во Flash и столкнулся с этой ошибкой. Я понятия не имею, как это сделать в сценарии действий, и буду признателен за любую помощь.

По сути, у меня есть оператор switch, который создает объект разного типа в зависимости от каждого случая (поскольку я бы предпочел не дублировать одни и те же десять строк кода для каждого случая), и я получаю «конфликт существует с определением во внутреннем пространстве имен», ошибка компилятора, и я думаю, что понимаю, почему.

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

Однако мой вопрос заключается в следующем - как правильно это сделать?

Первоначально я думал об объявлении переменной перед оператором switch, что приводит к ошибке «неявное принуждение значения типа object (One/Two) к несвязанному классу типа». Что мне здесь не хватает?


person Leandri    schedule 15.03.2015    source источник


Ответы (2)


Отказ от ответственности: мой AS3 немного заржавел ;)

Какого типа будет переменная Pow после оператора switch? objectOne или objectTwo? С точки зрения компилятора objectOne и objectTwo могут полностью отличаться друг от друга (читай: методы, поля,...)

Итак:
A) Сохранить имя переменной для обоих назначений, но объявить его перед оператором switch И использовать общий базовый тип (object, MovieClip,...)
B) Иметь 2 разные переменные: var PowOne: objectOne и var PowTwo: objectTwo

Я думаю, что вариант А был бы предпочтительнее...

person David Rettenbacher    schedule 15.03.2015
comment
Объявление Pow как типа MovieClip помогло! Поскольку существует 5 различных типов объектов, вы только что успешно сократили мой код на 50 строк :) Спасибо, мой добрый сэр! - person Leandri; 16.03.2015

Помимо ошибки компилятора, с которой вы столкнулись, еще одна проблема заключается в том, что вы планируете использовать переменную pow позже в своем коде, хотя они относятся к разным типам. Я предлагаю использовать преимущества наследования в ООП и создать базовый класс, от которого могут наследоваться ваши два пользовательских класса. Таким образом, они оба технически относятся к одному и тому же базовому типу, но при этом дают вам свободу настраивать каждый пользовательский класс, сохраняя при этом аналогичную функциональность в базовом классе.

Помните, ООП здесь, чтобы всегда помочь вам и избежать проблем, подобных той, с которой вы столкнулись, но вот как я бы это сделал, и я протестировал следующую реализацию во 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

Базовый класс

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, таких как MovieClip, Button и т. д. И тем самым вы добавляете пользовательские функции поверх их функций, поэтому 1) вам не нужно перестраивать кучу функций и 2) дает вам возможность повторно использовать их функциональность, добавляя свой собственный код!

person Anil Natha    schedule 15.03.2015
comment
Проблема здесь существует с дублированием кода. В операторе switch есть 5 случаев и, следовательно, 5 классов, которые должны быть определены, которые наследуются (без дальнейших реализаций), но путем объявления переменной Pow как общего базового типа (MovieClip) и последующего определения Pow как типа Object1 или Object2. ЭСТ. в каждом отдельном случае этого дублирования кода избегают - person Leandri; 16.03.2015
comment
Если бы в вашем посте было указано, что вам нужно что-то столь же простое, как переменная типа MovieClip для каждой переменной в переключателе с самого начала, это не было бы проблемой. Тем не менее, вы заявили, что у вас "есть оператор switch, который создает объект различного типа в зависимости от каждого случая", поэтому я поддерживаю свой ответ. Меньше кода не всегда означает хороший код. Даже если вы создадите простые классы, расширяющие возможности MovieClip, сейчас, а не позже, это означает, что вам придется меньше проводить рефакторинг. Если, конечно, ваш код никогда-никогда не изменится. - person Anil Natha; 16.03.2015
comment
Объекты бывают различных типов. Базовый тип тот же. Если бы я знал, что переменная может быть объявлена ​​как тип MovieClip, а затем определена как другой объект, я бы не задавала этот вопрос. И хотя меньшее количество кода не равносильно хорошему коду, меньшее дублирование означает хорошую практику. - person Leandri; 17.03.2015
comment
Я согласен с тем, что меньше дублирования — это хорошая практика, тут нет аргументов. Не менее важно отсутствие рефакторинга кода, особенно когда код, о котором мы говорим, код, который я собрал для вас, занял всего пару минут, чтобы написать и протестировать. Вы спорите о чем-то, что может помочь вам улучшить ваш код, позже потребует небольшого рефакторинга и потребовало минимальных усилий для создания. Это победа! Однако, как я уже сказал, что вы, похоже, пропустили, если вы никогда не собираетесь использовать какие-либо пользовательские функции, то вас устраивает то, что у вас есть. Просто пытаюсь помочь. Ваше здоровье. - person Anil Natha; 17.03.2015
comment
Я не хотел тебя обидеть. Я был уверен, что для этого конкретного проекта не будет специальной функциональности, поэтому я предпочитаю решение базового типа, однако я, вероятно, буду использовать этот код для будущих проектов, которые либо требуют дополнительных функций для отдельных классов, либо имеют менее производные классы, поэтому я проголосовал за ваше решение, потому что оно было очень полезным. Спасибо :) - person Leandri; 17.03.2015