PDA

Просмотр полной версии : супер вызывает сам себя?!


firelord
17.07.2007, 22:28
я в шоке - такого я за 15 лет еще не встречал...

вообщем, есть большой проект на классах - всякие иерархии, в частности:
City extends Field extends MapObject extends...
в частности, у них есть метод createFromXML - по которому каждый класс берет из узла то, что ему нужно. естественно, они по иерархии вызывают соотв. метод из наследуемого класса.

так вот: в методе createFromXML класса Field:

function createFromXML(node:XMLNode) {
super.createFromXML(node);
...........
}

super.createFromXML вызывает САМ СЕБЯ, т.е. Field.createFromXMLNode!!!

т.е. этот код вызывается два раза - один раз из наследника, и второй раз - из самого себя, как будто super указывает на класс Field, а не на наследуемый класс MapObject.
:wacko:

кто-нибудь сталкивался с таким??? да, это новый Flash CS 3, забыл упомянуть... и что с этим всем делать теперь?

etc
17.07.2007, 22:45
Весь код всех классов пожалуйста.

firelord
17.07.2007, 22:50
да не вопрос, в принципе ;) аттач. речь идет о классе map.Field

только сам ролик я сюда не могу закачать (весит 900 кило), да и локально его поднять все равно не получится :(

etc
17.07.2007, 22:58
Что-то у меня есть большие сомнения, что проблема именно в этом месте. Для начала неплохо было бы убрать лишние вызовы данного метода.

firelord
17.07.2007, 22:59
о каком месте идет речь? и что значит "лишние" вызовы?

я прежде чем писать, долго это все тестировал. пришел к однозначному выводу, что super.createFromXML в классе Field вызывает сперва Field.createFromXML, а затем уже MapObject.createFromXML

etc
17.07.2007, 23:02
Там в разных классах полно вызовов этих самых createFromXML. Но мне неначем тестить, ибо сами по себе эти классы не работают у меня.

firelord
17.07.2007, 23:07
вот еще небольшое пояснение:

function Field.createFromXML(node) {
trace("Field.createFromXML");
//super.createFromXML(node);
}

выдает при закоментаренном вызове super:
City.createFromXML
Field.createFromXML

если убрать комментарий (и больше НИЧЕГО не менять):
City.createFromXML
Field.createFromXML
Field.createFromXML
MapObject.createFromXML

createFromXML вызывается сверху донизу по иерархии класса при построении объекта из xml. в каждом методе вызывается super. тестить это сложно - надо яву поднимать :)

etc
17.07.2007, 23:10
firelord, не надо клепать посты подряд по N штук, это расценивается, как флуд, надо отредактировать свой последний.

Я сейчас соберу пару классов и проверю.

firelord
17.07.2007, 23:12
прошу прощения, буду внимательнее... нервы уже сдают...

etc
17.07.2007, 23:20
Это проблема, наблюдаемая в конкретном проекте. Мне не удалось воспроизвести её. Сделал связку BaseClass > TestClass > AnotherTestClass (в BaseClass ничего нет, в TestClass описан метод, в AnotherTestClass метод переписан и вызывает сначала метод супер-класса), никаких проблем не наблюдаю. Вполне возможно, где-то конфликт имен переменных, пакетов, замещение классов и т.п. неприятности.

firelord
17.07.2007, 23:35
ну, я вообщем и не ожидал, что это будет широко повторяющийся глюк. в принципе, я раскидал этот код по классам - убил вообще Field.createFromXML, вроде заработало... просто немного офигел от такой реализации виртуальных методов ;)

извините за беспокойство и спасибо!