Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Расширение класса (http://www.flasher.ru/forum/showthread.php?t=152409)

Srednas 17.03.2011 09:45

Расширение класса
 
Наверно вопрос глупый но все же:

хочу чтобы меш со мной здоровался:

Код AS3:

package{
        import alternativa.engine3d.objects.Mesh;
 
  public class Mesh2 extends Mesh{
 
                public function Mesh2(){
                                //
                }
 
                function sayHello():void{
                                trace("Hello!");
                }
  }
}

использую так:

Код AS3:

[..]
parser.parse(event.target.data, "model/texture");
for(var i=0; i<parser.objects.length; i++)
{       
 
                var mesh:Mesh2 = new Mesh2; // меши модели
                mesh = parser.objects[i] as Mesh2;
 
                mesh.sayHello();
}
[..]


Сtrl+Enter &rArr; появляется ошибка (при попытке mesh.sayHello)

Код:

Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null"
Где я торможу? И что подправить, чтоб заработало?

etc 17.03.2011 11:08

Что вы хотели сказать первой строкой в цикле?

bav 17.03.2011 11:31

Видимо, что-то у вас не работает в методе parser.parse(event.target.data, "model/texture");, потому что при попытке сослаться на parser.objects[i], вы получаете ссылку на null, о чем вам и говорит ошибка. А у null, очевидно, нет метода sayHello(). И да, зачем вы создаете новый объект Mesh2, в строчке, о которой говорит etc, если в следующей строчке вы уже привязываете к ссылке mesh что-то другое?
Про оформление кода:
Код AS3:

// Не забываем о спецификаторах доступа
public function sayHello():void{
    trace("Hello!");
}
 
// О типизации переменных
for(var i:int = 0; ... ; ...) { ... }
 
// Об операторных скобках конструктора
var mesh:Mesh2 = new Mesh2();


etc 17.03.2011 11:40

bav, нет, null получается при привидении Mesh к Mesh2.

Srednas 17.03.2011 12:41

Цитата:

Сообщение от bav (Сообщение 981196)
при попытке сослаться на parser.objects[i], вы получаете ссылку на null,

Null получается когда, приводится Mesh к Mesh2, т.к. если трейсить, то parser.objects содержит ровно столько объектов, сколько нужно )

Цитата:

Сообщение от etc (Сообщение 981190)
Что вы хотели сказать первой строкой в цикле?

Создание нового объекта. Причем если писать
Код AS3:

                var mesh:Mesh = new Mesh; // меши модели
                mesh = parser.objects[i] as Mesh;

то все отлично работает.

etc 17.03.2011 12:44

Srednas, а зачем вы его создаёте, если на следующей строке вы берёте меш из массива в эту же переменную?
Почему вы решили, что массив будет содержать Mesh2, а не Mesh?

Srednas 17.03.2011 13:21

Цитата:

Сообщение от etc (Сообщение 981217)
Srednas, а зачем вы его создаёте, если на следующей строке вы берёте меш из массива в эту же переменную?

Можно и не создавать. Просто написать var mesh:Mesh;

Цитата:

Сообщение от etc (Сообщение 981217)
Почему вы решили, что массив будет содержать Mesh2, а не Mesh?

В массиве будут содержаться меши. Но ведь и Mesh2 "тоже меш", т.к. является наследником. Или нет?

etc 17.03.2011 13:28

Цитата:

Сообщение от Srednas (Сообщение 981227)
В массиве будут содержаться меши. Но ведь и Mesh2 "тоже меш", т.к. является наследником. Или нет?

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

Srednas 17.03.2011 13:42

Цитата:

Сообщение от etc (Сообщение 981234)
Послушайте, если вы вырастили яблоки синего цвета у себя на подоконнике, то это не означает, что яблоки, лежащие на полках в соседнем магазине, будут синими и с вашего подоконника.

Не совсем понял аналогию :rolleyes:

Хорошо. Подскажите тогда как сделать так, чтобы у объектов из цикла появился метод sayHello()?

etc 17.03.2011 13:43

Переписать парсер, чтобы он в objects помещал ваши Mesh2.

Srednas 18.03.2011 08:23

Вообщем разработчики Альтернативы ответили так:
"кастить можно только к базовым классам, но не наоборот. то есть из Mesh2 можно сделать Mesh. А из Mesh – Mesh2 – нельзя. "
(http://forum.alternativaplatform.com...list/3716.page)

etc 19.03.2011 22:49

Ответили правильно, но в стиле «отвали».


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

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