2015-03-15 8 views
1

Я разрабатываю простую игру во Flash и сталкивался с этой ошибкой. Я не знаю, как это сделать в ActionScript и будет признателен за любую помощь.AS3 Как объявить объект без страшной ошибки «Конфликт существует»?

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

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

Мой вопрос, однако, в том, что это правильный способ обойти это?

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

ответ

2

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

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

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

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

+0

Объявление Pow как типа MovieClip сделало трюк! Поскольку существует 5 различных типов объектов, вы только что успешно сократили мой код на 50 строк :) Спасибо, мой хороший сэр! –

6

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

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

+0

Проблема возникает с дублированием кода. В операторе switch есть 5 случаев, и поэтому необходимо определить 5 классов, которые наследуют (без дальнейших реализаций), но объявляя переменную Pow как общий базовый тип (MovieClip), а затем определяя, что Pow имеет тип Object1 или Object2 ЭСТ. в каждом другом случае это дублирование кода не допускается –

+0

Если бы в вашем сообщении было указано, что для каждой переменной в коммутаторе с самого начала вам понадобилось что-то столь же простое, как переменная типа MovieClip, это было бы проблемой без проблем. Тем не менее, вы заявили, что у вас есть «оператор switch», который создает объект типа «различный» в зависимости от каждого случая »**, поэтому я поддерживаю свой ответ. Меньше кода не всегда означает хороший код. Даже если вы создадите простые классы, которые распространяются теперь из MovieClip, а не позже, это означает, что вам придется реорганизовать меньше. Если, конечно, ваш код никогда не изменится. –

+0

Объекты ** разных типов **. Базовый тип тот же. Если бы я знал, что переменная может быть объявлена ​​как тип MovieClip, а позже определена как другой объект, я бы не задал вопрос. И хотя меньше кода не соответствует хорошему коду, меньшее дублирование делает равную хорошую практику. –

 Смежные вопросы

  • Нет связанных вопросов^_^