Родитель определенного класса

Иногда необходимо узнать, есть ли среди родителей дисплейОбжекта объект определенного класса.

Сделать это можно, например, таким образом:

function getParentByClass(obj:DisplayObject, targetClass:Class):Object
{
        while (obj.parent)
        {
                if (obj.parent is targetClass) return obj.parent;
                else obj = obj.parent;
        }
        return null;
}

Оригинал статьи — blog.z-13.ru/2011/02/roditel-opredelennogo-klassa/
  • +3

Комментарии (61)

+4
Спасибо, Кэп! :)
0
«Рота — молчааать!»
Пожалуйста. ;)
+7
Я так понял пост написан исключительно ради «пиара» своего блога?
Не понимаю что такой пост делает в общих…
+10
Мда, это уже ерунда какая то. Следующий пост будет о том как присваивать переменной А значение переменной Б? :)
+4
Причем тут пиар блога — ссылку я пишу по договоренности с администрацией сайта.Если вам это очевидно и невероятно — хорошо, для остальных это может быть не так.
  • Z-13
  • Z-13
+5
вы описываете уже не в первый раз очень очевидные вещи, которые есть в том же муке
+4
> Иногда необходимо узнать, есть ли среди родителей дисплейОбжекта
> объект определенного класса.
А можно пример, когда такое может понадобиться. Я вот никак не могу придумать применение для такой функции.
+1
верно подмечено:)
0
Ага, очередной бунт против ООП ;)
0
Угу. Наличие в коде «is» — признак кривой архитектуры, не считая случая парсинга клипов или чего-нибудь подобного.
0
«is» не трогать :) Полезная вещь.
Есть например массив BaseEnemy, а нужно сделать выборку по SuperEnemy. Если без «is», придется вводить лишнее поле «Тип».
0
В случае с SuperEnemy «is» как раз и используется в качестве поля типа, это c-style. В современных языках для таких целей, как правило, используют полиморфизм.
+1
Я как раз пришел из современного языка :) Могу заверить, что там нет никаких предубеждений насчет «is». Много где он нужен и позволяет реализовать вещи удобнее, чем без него. Например, определить поддерживается ли классом интерфейс, например ICompare. Если поддерживается, то используем его, если нет, то сравниваем обычно. Или же если иерархия наследования большая, то is позволяет работать с целыми ветками, а не перечислять поименно каждый тип, и при этом не создавать лишний виртуальный признак.
0
может я неправильно понял, но переопределив функцию сравнения в потомке можно не проверять, является ли он ICompare или нет. Или я всё таки чего-то не понимаю?
0
Для того, чтобы переопределить метод, нужно сначала определить его в базовом классе. Если общий базовый класс есть, то естественно проблем никаких нет, а если классы разнородные, то не прокатит. Остаются только интерфейсы, как средство делегирования функциональности.
0
С ICoparable согласен, тут нормально.
BaseEnemy / SuperEnemy — режет глаз.
0
тут больше походило бы на бунт против паттернов) но я сомневаюсь что код причастен к ним))
0
Да я не так глубоко ) просто сам был нубом в ООП (да и не валом сейчас могу нос задирать) и поначалу все никак не мог понять, как жить без того, чтобы постоянно лазить «наверх» ;)
+2
ух ты а я и не знал, что тут можно играть в капитана очевидность и создавать такие топики…
0
А кто-нибудь знает
функцию для того, чтобы определить, есть ли у моего дисплейОбжекта ребенок определенного класса?
+3
А это уже тема для отдельного поста, а может даже и серии статей )))
0
Заменить проверку name на is, и получится то что нужно ;).
static public function findChildByName(clip: DisplayObjectContainer, name: String): DisplayObject
{
var child: DisplayObject = clip.getChildByName(name);
if (child)
{
return child;
}
for (var i: int = 0; i < clip.numChildren; i++)
{
child = clip.getChildAt(i);
if (child is DisplayObjectContainer)
{
var ch: DisplayObject = findChildByName(child as DisplayObjectContainer, name);
if (ch)
{
return ch;
}
}
}
return null;
}
0
Ох, форматирование померло :/.
0
тут еще можно по разному интерпретировать, то ли в возвращать boolean с нашелся или нет, то ли возвращать список всех объектов определенного типа, и так же рекурсивно делать проверку у дочерних дисплейОбжктов))
+2
Оригинал статьи…
А статья то где?
+1
Самопеар, такой самопеар…
  • Hibou
  • Hibou
+3
Спасибо всем за отзывы.
Продолжение следует!
  • Z-13
  • Z-13
0
а можно узнать, какие выводы автор сделал из комментариев к своему посту?
+1
Будет продолжать :-)
+3
хочу минус в оценках статьи)
0
На самом деле очень не хотелось бы, т.к. сразу появятся минусящие тролли и прочие радости интернета, которые пока миновали данное сообщество. Впрочем все это проблемы роста…
+1
с другой стороны вход сюда по инвайтам
и выходит однобокая объективность когда можно только «плюсануть» пост
0
Статья удалась! Без кавычек — т.к. столько отзывов и большинство показали, что «они классные» — «разве это не чудо?»

Кому статья была полезна — оценили тему(или коммент) — но решили не комментить, чтобы не светится.
+5
флэшгеймблог уже не торт..)))
0
ЛОЛ :D
+2
Может я чего не понимаю, но в реальной жизни такая конструкция врядли пригодится. Зачем просто знание что экземпляр такого-то класса есть в принципе? Если именно надо знать есть или нет, то сильно лучше просто при добавлении удалении флажок ставить, а при проверке только на него смотреть. Ускорение будет космическое вместо того чтобы бегать по массиву. Но вообще я и такого не могу понять, такое не должно быть нужну.

А вот если задача найти экземпляр, чтобы с ним что-то делать, то потребуется потом этот объект кастить, чтобы использовать. А для этого надо пользоваться сразу as а не is. И проверка и кастинг одновременно.
0
Это понадобилось для того, чтобы игнорировать клик по стейджу, если этот клик был осуществлен на объекте определенного типа, который находится среди моих родителей.

Т.е. я нахожусь в каком-то компоненте и при клике где-либо на стейдже должно что-то произойти, однако, если кликнули на определенный объект, который среди моих родителей, это надо игнорировать.
0
mouseChildren тебе в руки :-)
0
сам по себе родитель должен работать
0
А почему он не будет работать? mouseEnabled то включен.
0
Я беру этот таргет и проверяю, есть ли среди родителей определенный компонент. Если есть — я игнорирую этот клик, а если нет, то обрабатываю.
  • Z-13
  • Z-13
+3
все бы логично, но зачем делать пост о каждом пуке?
0
Подобная штука мне была нужна в игре Duplicator, но это опять же единичный случай:
-был момент, когда я кликал мышкой по ящику, а в этот момент рука персонажа перегораживала ящик — то таргетился персонаж.

Да в этом случае решила бы растоновка mouseEnabled, но почему-то не спасало(криворукий код). (:
  • z3lf
  • z3lf
0
FFFFUUUUUUUUUUUUU!
растановка*
+1
расстановка* :)
+1
epicfail))
как я так не заметил)
0
не ООП мне учить надо, а грамматику))
+1
орфографию )
+1
double epic fail ))
+1
ну вы мужики и морите)))
+1
У меня в игре вообще все проверки на столкновения происходят по координатам :), а не на каком объекте мышка кликнула.
+3
ох, друзья, злые вы. :)

во-первых это не «самопеар». это — правильный кросспостинг, с полным текстом оригинального поста. так что тут всё как положено. а если для вас кусок кода в посте очевиден, то можете просто об этом сказать, но бросаться словами о самопиаре в данном случае ни к чему. по самопиару у нас тут пока только grmaster специализируется со своим порталом fungamedays.com :)

во-вторых мне кажется тут ранее проскакивали и более «неоднозначные» посты, реакцей на которые был нулевой рейтинг и отсутствие комментариев. этот пост лично я оцениваю как более полезный, чем те, которые проскакивали. и хоть и понимаю негодование, но всё же удивлен столь бурной реакции. теряем, друзья, нашу фирменную терпимость и дружелюбие. :) сначала вылили ушат воды на автора, а только потом начали выяснять, для чего он использует этот код и предлагать альтернативные варианты. эххх)
0
сначала вылили ушат воды на автора, а только потом начали выяснять, для чего он использует этот код и предлагать альтернативные варианты.
= true;
0
теряем, друзья, нашу фирменную терпимость и дружелюбие. :)

Так ведь это только вроде к старичкам, не? :3
0
Дедовщина!!! омфг! Нужен Newgamedevblogs.ru! С троллями и чатом! Без инвайтов! Протянет месяц! Потом сам отвалится… Ну понятно что далеко не все профи, нуно проявлять терпимость. Я например вообще нубяра. Ожидаю что коммьюнити поддержит, за тем и здесь (нет не затем чтобы коммьюнити подтвердило что я нубяра:D ) Ну небольшой пост, но зато есть. А что ты сделал для флешгеймблогс сегодня? Шутка)) Предлагаю предмодерирование паблик постов, чтобы просто такая ситуация не повторилась. Не катит для паблика — в личные дела. А ставить минусы как кто-то предлагает это зло. Очень легко причем начать его делать)) А остановиться нереально потом, спрашивается зачем загонять всех в окопы. Приезжайте на встречи, общайтесь лично, глядишь подобные желания сами собой отпадут.
0
Мне кажется всё проще. Минусовать действительно не надо, просто сделать появление на главной допустим с 2х голосов. Если пост никому не нужен, он останется в личке где его всё равно смогут посмотреть. А если он хоть кому то нужен(а 2 голоса это не 10), он очень скоро окажется на главной. И тогда прекратятся нападки и претензии о ненужных статьях…
0
у этого поста 2 голоса, все зависит от количества людей в коммюнити, чем их больше тем и выше должен быть проходной бал
0
Можно проще: не премодерация, а постмодерация, так как такие посты редки. У модераторов наверняка есть возможность перенести пост в Персональные.
А вообще лучше бы были какие-то правила по тематике постов. А то сейчас многие по-видимому соотносят эти блоги с хаброй, неосознано превнося сюда её правила, отсюда и ярая критика.
0
Я вообще мало понимаю разницу между личным, и публичным постом.
+1
Типа в личных постах можно писать что пожелаешь, например вести дневник разработки своих игр, или выкладывать всякие понравившиеся куски кода или арта. А в публичных можно писать только то, что явно будет интересно и полезно для окружающих: например, итоги по игре, обзоры технологий и т.д.
+1
Я же пошутил :) лично я ко всем одинаково дружелюбно стараюсь относится, если конечно этот всякий не начнёт первым хамить.

Что до этого поста… помоему просто достаточно было попросить автора перенести пост в личные, т.к. он мало информативен. Вот и все дела :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.