Конструктор класса AS3/базового класса

Дополнение к моему предыдущему вопросу.

У меня на сцене есть кнопка с классом Game1 (я не определял этот класс, просто связал его, как Хуан ответил на мой другой вопрос). Кнопка имеет «GameButton» в качестве базового класса, который на данный момент содержит несколько простых операторов x, y.

Все мои кнопки будут иметь фиктивный класс GameX и базовый класс GameButton; таким образом, они наследуются от базового класса, но могут иметь другую графику.

У меня есть основной класс, который содержит код для добавления этой кнопки:

public class MainAteam extends MovieClip
{
    public var btn1:Game1;

    public function MainAteam()
    {
        btn1 = new Game1();
        addChild(btn1);
        btn1.addEventListener(MouseEvent.CLICK, startGame1);
    }
    // startGame 1 function here
}

Теперь я хотел бы иметь возможность задавать значения x, y через параметры, чтобы я мог размещать каждую кнопку в другом месте. Однако, когда я пробую новую игру (5,5) и помещаю в конструктор GameObject следующее:

package 
{
 import flash.display.SimpleButton;

 public class GameButton extends SimpleButton
 {
    public function GameButton(startX:Number, startY:Number)
    {
        x = startX;
        y = startY;
    }
  }
}

Я получаю следующую ошибку:

1203: No default constructor found in base class GameButton

Я действительно не знаю, как это исправить, так как я позволяю Flash определять классы GameX для меня (я полагаю, они просто пусты) и использовать базовый класс для установки некоторых свойств. Если просто поставить x=5; y=5, то работает нормально. Большое спасибо.


person Joris Ooms    schedule 20.03.2011    source источник


Ответы (1)


Это одна из двух вещей: либо вам нужно вызвать super(); из вашего конструктора, или вы не реализовали необходимые свойства/методы класса при инициализации. Попробуйте расширить Button, а не SimpleButton, посмотрите, будет ли это работать лучше для вас.

EDIT Мой первый ответ был правильным, но все же неверным. Проблема в том, что вы создаете классы Game1, Game2 и т.д., а не вызываете конструктор класса GameButton. Когда вы расширяете класс, который имеет НЕОБХОДИМЫЕ аргументы конструктора, вы должны предоставить их с помощью super(); Итак, в этом случае внутри вашего конструктора класса Game1 вам нужно вызвать:

super(positionX, positionY);

OR

Вы можете изменить конструктор GameButton, чтобы он имел значения по умолчанию, например:

public function GameButton(var x:int = 0, var y:int = 0)

Если вы не знаете, super() — это просто способ доступа к конструктору базового класса, который также можно назвать суперклассом, поэтому метод и называется super :). Надеюсь это поможет.

ТАКЖЕ

Также обратите внимание, что если вы создаете эти классы Game1, Game2 и т. д. из Flash IDE (в библиотеке), вам нужно будет пойти по пути добавления значений по умолчанию в конструктор GameButton, поскольку Flash автоматически генерирует классы для библиотечные объекты. В качестве альтернативы вы все равно можете создавать графику в предварительно скомпилированных библиотечных клипах и вместо определения класса + базового класса в настройках Export For Actionscript создать фактический класс Game1/Game2 и т. д. вручную, как вы сделали для GameButton, а затем в Export For Область ActionScript помещает полное квалифицированное имя класса. Вот так:

введите здесь описание изображения

person Community    schedule 20.03.2011
comment
Что я сделал сейчас, так это поместил btn1.x =, btn1.y = в свой основной класс (мой игровой класс), но я не уверен, что это хорошая практика. Я бы предпочел отправить его в конструктор с параметрами. Проблема, которую я вижу в этом, заключается в том, что я позволяю Flash генерировать эти классы Game1, Game2, которые я на самом деле не использую. Я не могу поставить super(); там (я полагаю, что он пойдет туда). Все еще в замешательстве :( - person Joris Ooms; 21.03.2011
comment
Я просто обновил свой ответ несколько раз, смеется, чтобы все объяснить. Любые вопросы, не стесняйтесь спрашивать. - person ; 21.03.2011
comment
Да, я разместил больше информации о том, что делать в этой ситуации, а также объяснил, как все это работает / что это значит. У вас есть 2 варианта (их больше, но для простоты): в основном создавать и использовать эти классы самостоятельно (вручную) или добавлять значения по умолчанию в конструктор суперкласса. - person ; 21.03.2011
comment
Большое спасибо. Я все еще в замешательстве, ха-ха. Я не знаю, читали ли вы мой предыдущий вопрос, но то, что я сделал, было... Я создал класс GameButton, и в этот момент у меня были статические значения x, y. Таким образом, я мог разместить кнопки (которые получили классы Game1, Game2, ..) на сцене с помощью всего одного конструктора, но с другой графикой. Однако на самом деле я не определял эти классы, я просто позволил Flash генерировать пустые классы. Если я хочу использовать super(), не придется ли мне делать кнопку AS для каждой кнопки? Я хотел избежать необходимости создавать 4-5 разных файлов, в основном просто super(). - person Joris Ooms; 21.03.2011
comment
Я не совсем уверен, что вы имеете в виду: Таким образом, я мог бы разместить кнопки (которые получили классы Game1, Game2, ..) на сцене с помощью всего одного конструктора. Если бы вы сделали это и не изменили/установили позиции вручную после создания экземпляров классов, все они были бы сложены друг на друга. Если вы хотите, чтобы все они начинали с предопределенной, уникальной позиции, вы не сможете сделать это таким образом. Вам придется вручную установить положение каждого элемента так или иначе. - person ; 21.03.2011
comment
Да, я обнаружил, что нагромождение друг на друга происходит на собственном горьком опыте. Вот тут-то и возникает этот вопрос. Так что, думаю, я просто создам 4 файла с помощью super(); в них. А может просто 4 файла с одним конструктором в каждом? так что я могу удалить класс GameButton .. Спасибо за ваше время! - person Joris Ooms; 21.03.2011
comment
Я бы просто исключил базовый класс, разрешил флэш-памяти генерировать классы для Game1 и т. д., а когда вы создаете их экземпляры, просто устанавливайте позицию. Например, var p:Game1 = new Game1(); п.х = 10; р.у = 100; и Т. Д. - person ; 21.03.2011
comment
Хорошо, я сделаю это. Кажется, я слишком старался, когда все было так просто. Еще раз спасибо за ваше время. - person Joris Ooms; 21.03.2011