Форум 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=122582)

RaVeN-Nikma 14.03.2009 01:09

Как из дочернего класса правильно обратиться к родительскому
 
имхо вопрос.

Вот код родительского класса:
Код AS3:

package {
    public class mainMap
    {
        public function createObject():void
        {
              var obj:MapObject = new MapObject();
              obj.createObject();
        }
 
        public function countObj():void
        {
              trace("function");
        }       
    }
}

дочерний класс:
Код AS3:

package {
    public class MapObject
    {
        public function createObject():void
        {
              super.countObj();
        }       
    }
}

Кидает ошибку: ReferenceError: Error #1070: Не удалось найти метод countObj в Object

Нашел мало информации по данному вопросу, может кто подскажет правильный метод. :moder:

Gaen 14.03.2009 01:26

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

Посылайте наверх событие.

DarkLight 14.03.2009 01:42

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

serenkiy 14.03.2009 01:55

Ну во-первых не совсем понятно чего Вы добиваетесь.
Я представляю 2 варианта:

1. На сцене есть некоторый объект (родитель), в родителе содержится дочерний. Родитель - класс MapObject. Дочерний назовем ChildClass.
В таком случае, прежде, чем что-либо вызывать из родительского класса дочерним, надо дочерний добавить в список отображения.
Поясняю кодом.

Родительский:
Код AS3:

package 
{
    public class MapObject extends Sprite
    {
 
        private function MapObject(){
        }
 
        public function createObject():void
        {
              var obj:ChildClass= new ChildClass();
              addChild(obj);
              obj.createObject();
        }
 
        public function countObj():void
        {
              trace("It's worked!");
        }       
 
    }
}

Ну и дочерний:
Код AS3:

package 
{
    public class ChildClass extends Sprite
    {
        private function ChildClass()
        {
        }
 
        public function createObject():void
        {
 
        }
 
    }
}

2. Учитывая что у Вас родительский и дочерний классы названы одинаково, чего быть в принципе не может, если только это не один и тот же класс, можно попытаться сделать такой код (что правда я не тестировал, и гарантировать стабильную работу не буду):

Код AS3:

package 
{
    public class MapObject extends Sprite
    {
        private var obj:MapObject = new MapObject();
 
        private function MapObject(){
              addChild(obj);
        }
 
        public function createObject():void
        {
              MapObject(parent).countObj();
              obj.createObject();
        }
 
        public function countObj():void
        {
              trace("It's worked!");
        }       
 
    }
}

Практическое применение данному коду я не представляю. Если проанализировать код, он придет к зависанию плеера (т.к. создается класс MapObject, который в свою очередь создает себя и так до бесконечности (ну почти ;) ).

Если можно, уточните более подробно, чего Вы добиваетесь.

BlooDHounD 14.03.2009 02:26

GAIKER, абсурда какого-то Вы тут на наговорили :)

Gaen 14.03.2009 03:13

BlooDHounD, это был тонкий юмор :)
http://bash.org.ru/quote/395556

RaVeN-Nikma 14.03.2009 12:18

Одинаковые названия классов, это с копированием кода ошибся, извиняюсь.

Разобрался с наследованием, но функцию все равно вызывает неверно.

Родитель
Код AS3:

package {
    public class mainMap
    {
        public var mc_main:MovieClip = new MovieClip();
 
        public function createObject():void
        {
              var obj:MapObject = new MapObject();
              obj.createObject();
        }
 
        public function countObj():void
        {
              trace(mc_main.numchildren);
        }       
    }
}

Дочка
Код AS3:

package {
    public class MapObject extends mainMap
    {
        public function createObject():void
        {
              super.countObj();
        }       
    }
}

mc_main содержит 5 детей. Если функцию вызывать из родителя, то trace выводит результат 5, если функцию у родителя вызывает дочь, то выводит 0. Почему функция работает не корректно?

flashscout 14.03.2009 15:14

2all - простите меня серого, но разве так можно:
public class MapObject extends Sprite
{

private function MapObject(){
}
?????

serenkiy 15.03.2009 00:36

Если можете, вышлите наиболее подробный код. А то анализировать код с ошибками сложно. Например, у Вас CreateObject() присутствует как в родительском, так и в дочернем классе. При том в дочернем функция должна быть override, а у Вас нет - это вызвало ошибку при тестировании кода.

RaVeN-Nikma 15.03.2009 14:08

Вот полный код:

http://www.bestbrok.com/AC3.rar

Если функцию countObj() запускает родитель, то trace выдает 5 (это верно). Если функцию запускает дочка, то trace кидает 0. Все есть в архиве


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

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