Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   работа с классами (http://www.flasher.ru/forum/showthread.php?t=180513)

Svoy4 04.06.2012 15:27

работа с классами
 
помогите разобраться
создал класс наследуемый от array
Код AS3:

package  SVoyGame 
{
        import flash.utils.ByteArray;
 
        public class ArrayPole extends Array
        {
                public function ArrayPole(sizey:int, sizex:int):void
                {
                        for (var yy:int = 0; yy < sizey ; yy++) {
                                ArrayPole[yy] = new ByteArray;
                                for (var xx:int = 0; xx < sizex ; xx++) {
                                        ArrayPole[yy][xx] = 0;
                                }
 
                        }

в основном тексте использую
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import SVoyGame.ArrayPole;
 
        public class Main extends Sprite
        {
                public function Main():void
                {
                        var pole:ArrayPole;
                        trace(pole[5][5]);

вот в этом месте и возникает ошибок
[Fault] exception, information=ReferenceError: Error #1069: Не удалось найти свойство 0 в SVoyGame.ArrayPole; отсутствует значение по умолчанию.
подскажите пожалуйста
как к этому массиву теперь обращаться

t4arty 04.06.2012 15:33

ByteArray не равен Array (ошибка типов переменных)

Партизан 04.06.2012 15:35

Код AS3:

var pole:ArrayPole = new ArrayPole(0,0);


Svoy4 04.06.2012 15:41

Цитата:

Сообщение от Партизан (Сообщение 1082830)
Код AS3:

var pole:ArrayPole = new ArrayPole(0,0);


да да пропустил строчку в вопросе она там есть перед выводом

Добавлено через 1 минуту
Цитата:

Сообщение от t4arty (Сообщение 1082829)
ByteArray не равен Array (ошибка типов переменных)

ByteArray как вложенность самого Array

Партизан 04.06.2012 15:47

Код AS3:

for (var yy:int = 0; yy < sizey ; yy++) { 
                                this[yy] = new ByteArray;
                                for (var xx:int = 0; xx < sizex ; xx++) {
                                        this[yy][xx] = 0;
                                }
 
                        }


Svoy4 04.06.2012 15:47

т.е. массив содержит массивы ByteArrey

Добавлено через 38 секунд
Цитата:

Сообщение от Партизан (Сообщение 1082837)
Код AS3:

for (var yy:int = 0; yy < sizey ; yy++) { 
                                this[yy] = new ByteArray;
                                for (var xx:int = 0; xx < sizex ; xx++) {
                                        this[yy][xx] = 0;
                                }
 
                        }


хм попробую

udaaff 04.06.2012 15:53

Код AS3:

dynamic public class ArrayPole extends Array


Svoy4 04.06.2012 15:56

this не прошел
[Fault] exception, information=ReferenceError: Error #1056: Не удается создать свойство 0 в SVoyGame.ArrayPole.
на строке this[yy]=new bytearray;

Партизан 04.06.2012 15:58

Цитата:

Сообщение от Svoy4 (Сообщение 1082841)
this не прошел

Udaaff написал выше почему

Svoy4 04.06.2012 15:59

Цитата:

Сообщение от udaaff (Сообщение 1082840)
Код AS3:

dynamic public class ArrayPole extends Array


не помогло
да и вообще это относиться только к классу (кажись)
а не к его экземпляру

Добавлено через 1 минуту
trace(ArrayPole[5][5]); в классе
выдает инфу
а в основном тексте уже нет

Добавлено через 6 минут
т.е. приложение запускается
объявляется pole:arraypole
конструктор срабатывает внутри класса выводит инфу
но не передает ее экземпляру
как то так получается

Партизан 04.06.2012 16:09

Еще раз....
Код AS3:

dynamic public class ArrayPole extends Array
 
for (var yy:int = 0; yy < sizey ; yy++) {
        this[yy] = new ByteArray;
        for (var xx:int = 0; xx < sizex ; xx++) {
                this[yy][xx] = 0;
        }
}
 
 
// в Main
var pole:ArrayPole = new ArrayPole(5,5);
trace(pole[2][0]);


Svoy4 04.06.2012 16:17

pole.length пишет ноль

Добавлено через 1 минуту
почти цикл в конструкторе
public function ArrayPole(sizey:int, sizex:int):void

Добавлено через 3 минуты
да с this захлебнулся на уровне создания-заполнения еще в классе

Партизан 04.06.2012 16:28

Вот так должен выглядеть ваш класс
Код AS3:

package
{
        import flash.utils.ByteArray;
 
        public dynamic class ArrayPole extends Array
        {
 
                public function ArrayPole(sizex:int, sizey:int)
                {
                        for (var yy:int = 0; yy < sizey; yy++)
                        {
                                this[yy] = new ByteArray;
                                for (var xx:int = 0; xx < sizex; xx++)
                                {
                                        this[yy][xx] = 0;
                                }
                        }
 
                }
 
        }
 
}

А вот так вы должны его создавать:
Код AS3:

var pole:ArrayPole = new ArrayPole(5, 5)
trace(pole.length) // 5


Svoy4 04.06.2012 16:31

в SVoyGame/ArrayPole.as
Код AS3:

package  SVoyGame 
{
        import flash.utils.ByteArray;
 
        public class ArrayPole extends Array
        {
                public function ArrayPole(sizey:int, sizex:int):void
                {
                        for (var yy:int = 0; yy < sizey ; yy++) {
                                ArrayPole[yy] = new ByteArray;
                                for (var xx:int = 0; xx < sizex ; xx++) {
                                        ArrayPole[yy][xx] = 0;
                                }
                        }
              trace(ArrayPole[2][2]);// выводит инфу

в основном тексте использую Main.as
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import SVoyGame.ArrayPole;
 
        public class Main extends Sprite
        {
                public function Main():void
                {
                        var pole:ArrayPole;
                        trace(pole[2][2]);// вот в этом месте и возникает ошибок

[Fault] exception, information=ReferenceError: Error #1069: Не удалось найти свойство 0 в SVoyGame.ArrayPole; отсутствует значение по умолчанию.

Добавлено через 2 минуты
UOTE=Партизан;1082854]Вот так должен выглядеть ваш класс
Код AS3:

package
{
        import flash.utils.ByteArray;
 
        public dynamic class ArrayPole extends Array
        {
 
                public function ArrayPole(sizex:int, sizey:int)
                {
                        for (var yy:int = 0; yy < sizey; yy++)
                        {
                                this[yy] = new ByteArray;// вот здесь уже ошибка - пишет компилятор

[/quote]

Добавлено через 7 минут
соврал
не там ошибка

Добавлено через 9 минут
в функции конструктора есть еще функция
в ней к ArrayPole тоже обращать через this или ArrayPole

Добавлено через 22 минуты
Код AS3:

PlusOne(yy, xx );
function PlusOne(y:int, x:int):void {
if (y<size) {
...
                                if (this[y][x] < 255) { // [Fault] exception, information=TypeError: Error #1010: Термин не определен и не имеет свойств.
 
                                        this[y][x]++;
                                }
                        }

ArrayPole - тоже не работает

Добавлено через 28 минут
ага проблема в функциях внутри конструктора
// закоментировал одну в другой проблема
- они не видят массив

Партизан 04.06.2012 17:11

почитайте вот тутклассы

Svoy4 04.06.2012 17:12

выкинул их за пределы конструктора (модифицировал осуществлением передачи size)
все заработало как надо
объясните пожалуйста в чем проблема была

in4core 04.06.2012 17:15

Код AS3:

var pole:ArrayPole;
                        trace(pole[2][2])

Вот в этом. Вы не создавали экземпляр

Svoy4 04.06.2012 17:19

канчно new arraypole
надо читать меж строк

in4core 04.06.2012 17:24

Цитата:

надо читать меж строк
А может еще и алхимимей заняться? Тут форум, а не шарады

Svoy4 04.06.2012 17:29

))
там не код был представлен
а рассуждения действий
а если рядом код взглянуть то всё на месте
так что придирки к словам

Добавлено через 1 минуту
конечно же я только учусь и мож не правильным словарем пользуюсь

Добавлено через 14 минут
вернемся к теме
выкинул их(функции которые были внутри конструктора) за пределы конструктора (модифицировал осуществлением передачи size)
все заработало как надо
объясните пожалуйста в чем проблема была
разве нельзя объявлять функцию внутри функции
и если можно то почему внутренняя функция не видит переменные главной

RJ Presto 04.06.2012 22:05

ну во-первых - документация по Array говорит нам следующее
Цитата:

You can extend the Array class and override or add methods. However, you must specify the subclass as dynamic or you will lose the ability to store data in an array.
т.е. то, что написал udaff делать надо обязательно.
относится это именно к экземпляру класса, и тогда this[0] работает.

во-вторых, у вас в коде ересь. вы кладёте в поле ByteArray, а потом пытаетесь что-то еще положить в него.
если вы хотите, чтоб у вас был массив x*y из ByteArray - должно быть так
Код AS3:

for (var yy:int = 0; yy < sizey ; yy++) { 
                                var tmpArray:Array = new Array();
                                for (var xx:int = 0; xx < sizex ; xx++) {
                                        tmpArray[xx] = new ByteArray();
                                }
                                this[yy] = tmpArray;
                        }

а вообще, писали бы push и всё


UPD
извиняюсь, если это уже написали - пропустил вторую страницу

Svoy4 04.06.2012 23:26

Код AS3:

package SVoyGame 
{
        public class GraphDates extends Array
        {
                        for (var nnn:int = 0; nnn < 10; nnn++) { // уже здесь ошибка - подчеркивает nnn
                                GraphDates[nnn] = .... // заполнение

src\SVoyGame\GraphDates.as(12): col: 16 Error: Access of undefined property nnn.
GraphDates[nnn] = ...;
теперь то что
во что я не врубаюсь
ни как не пойму

udaaff 05.06.2012 00:07

Svoy4, вы, вообще, пытаетесь понять то, что вам пишут или нет?

На текущий экземпляр класса ссылается this.
Класс нужно объявить как динамический.

Партизан 05.06.2012 00:16

Думаю, я знаю решение этой задачи века...

Svoy4, думаю, вот так у вас будет работать:
Код AS3:

var pole:ArrayPole= ArrayPole(5,5);
trace(ArrayPole[2][2]);


Svoy4 05.06.2012 09:40

Цитата:

Сообщение от udaaff (Сообщение 1082952)
Svoy4, вы, вообще, пытаетесь понять то, что вам пишут или нет?

На текущий экземпляр класса ссылается this.
Класс нужно объявить как динамический.

пробывал не помогает

Добавлено через 5 минут
\src\SVoyGame\GraphDates.as(12): col: 5 Error: The this keyword can not be used in static methods. It can only be used in instance methods, function closures, and global code.
this[nnn] = new Array;

etc 05.06.2012 09:50

Ну конечно не работает, если писать код вне методов класса.

Предлагаю автору сначала изучить теорию, а не терроризировать форум тщетными попытками что-то сваять научным тыком.

Svoy4 05.06.2012 09:51

Код AS3:

package SVoyGame 
{
        public dynamic class GraphDates extends Array // и без изменяемого класса (dynamic)
        {
                        for (var nnn:int = 0; nnn < 10; nnn++) {
                                this[nnn] = new Array;  // и с прямым обращением GraphDates

ругаеться

Добавлено через 2 минуты
Цитата:

Сообщение от etc (Сообщение 1083013)
Ну конечно не работает, если писать код вне методов класса.

хм
а если мне не нужны методы
class - хочу использовать как статическую базу данных

etc 05.06.2012 09:55

Цитата:

Сообщение от Svoy4 (Сообщение 1083014)
а если мне не нужны методы
class - хочу использовать как статическую базу данных

Методы могут быть и статическими. Только вот проблема в том, что сам класс (не экземпляр) динамическим сделать нельзя, поэтому какие-то свойства запихать в него не получится.

Svoy4 05.06.2012 09:57

Цитата:

Сообщение от etc (Сообщение 1083013)
Предлагаю автору сначала изучить теорию, а не терроризировать форум тщетными попытками что-то сваять научным тыком.

)) теорию читал изучал
но без практики ни как не изучить
если хватало только теории тогда вообще форум не нужен был
только галерея работ

Добавлено через 5 минут
по основном тексте
создавал array c вложенными array ...
заполнял их нужной информацией
и обращался к ним как к статическим данным разложенными по ячейкам
но это был просто громадный кусок кода
хотел его выкинуть за пределы основного кода
использование класс мне показалось не плохая идея
мож что нибудь другое посоветуете

Добавлено через 25 минут
мож include

in4core 05.06.2012 13:52

Какой нафиг инклюд... Давай так Svoy4 - вы напишите какая у вас задача, словесно, без ваших примеров кода, а мы покажем кодом , как выполняется данная задача.
Сейчас вы видимо даже не понимаете, что у любого класса есть конструктор, даже если вы его не указываете явно, а написать цикл ВНЕ методов , создавая там же локальные переменные, это все равно , что метла-микроволновка, огурец-нога....

Wolsh 05.06.2012 14:22

Пока Вы считаете, что классы это такая милая фишечка, которая поможет Вам уменьшить количество главного кода в кадрах, ничего хорошего не выйдет. Вы должны принять решение, что полностью переходите на код в классах (рано или поздно это сделать придется), и начать изучать КАК. Как пишутся и организуются классы. Не надо выдумывать из головы "может быть, так?" Все не настолько просто. Класс это не выдранный фрагмент текста. У него есть структура. Читайте, изучайте. Смотрите примеры. Делайте простые тесты с ясными результатами. Гадать бессмысленно. Потратите кучу времени и не приобретете ничего кроме новых заблуждений.


Часовой пояс GMT +4, время: 04:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.