Просмотр полной версии : Проверить класс на наличие метода
Akopalipsis
19.10.2013, 01:25
Возможно как то проверить класс на наличие метода, если этот метод в супер классе предназначен для переопределения. То есть он public и всякий раз, когда я проверяю под класс на его наличие, возвращается true , даже если он не был переопределён. Пробовал hasOwnProperty, остальные методы класса Object всегда фалсе возвращают.
Нет нельзя и не нужно. практического смысла нет.
Akopalipsis
19.10.2013, 02:22
Если сказать что я сейчас думаю, то да, не нужно.
Просто после чтения книги, где я узнал об "абстрактных" классах, в методах были добавлены
вызов ошибки в случаи вызова метода в этом абстрактном классе. Теперь я понимаю, что они были для обязательного переопределения.
В AS3 абстракция атрофирована. Забудьте о ней
А вообще советую раз такой любознательный потихоньку разбирать JAVA . В будущем больше проку будет. Переучиваться с AS на более сложные языки тяжелее в конце, чем сразу
Akopalipsis
19.10.2013, 03:19
А вообще советую раз такой любознательный потихоньку разбирать JAVA .
Спасибо за совет! В будущем обязательно буду учить, но пока as3 мне хватает.
И я пробуя делать мелочи в других языках, почему то подумал, что после as3 легче понять другие языки, чем наоборот.
Языки везде одни, синтаксис разный вот и все. + плюшки свои есть. Но после AS понять ты сможешь php или JS, например. Но не C# или JAVA . Синтаксис поймешь, но тебе будет невдомек почему надо делать обязателное исключение, почему здесь потоки, а не события в целом*, откуда взялись генерики ну и т.п. много всего того, чего нет в ас, того что нужно понять, а не просто зазубрить, например.
tsarapkabel
19.10.2013, 11:44
В AS3 абстракция атрофирована. Забудьте о ней.
Быть может абстракция не столь полноценна, но забывать о ней не стоит, ООП как-никак.
tsarapkabel я не в прямом смысле имею ввиду. ПРосто когда что то неполноценно* этим пользоваться все равно широко не будешь. а раз не будешь, то и думать об этом не стоит, лишняя инфа. ну не для AS абстракция, уж извините.
Можно сымитировать абстракцию только на этапе выполнения: поместите в суперклассе в методе
throw new Error();
Но на этапе компиляции такое провернуть нельзя.
caseyryan
19.10.2013, 14:40
Странно, что тут никто не упомянул про интерфейсы. Интерфейсы и есть заменитель абстракции в ас3
caseyryan - потому что интерфейсы есть интерфейсы, они везде есть, не только в AS
Если использовать интерфейс, то суперкласс обязан реализовать метод, а это то же самое, что просто реализовать метод в суперклассе без пинка от интерфейса. В классах-наследниках все равно не обязательно оверрайдить эти методы, чего и хочет избежать топикстартер.
Однако, классам наследникам можно назначить интерфейс, не суперклассу. Да, ок, как вариант. Однако, тогда суперкласс не имеет право использовать эти методы внутри себя, ибо он о них совершенно ничего не знает.
vorodis2
19.10.2013, 15:06
//Возможно как то проверить класс на наличие метода,
var xml:XML = describeType(klass);
Выдаст весь класс в хмл
ХЗ может это и не то что Вым надо.
AlexCooper
19.10.2013, 15:09
Можно использовать describeType () (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#describeType()) но я рекомендовал использовать интерфейс
И мой совет топикстартеру: не заморачивайтесь на этот счет. Абстракция в том ее понимании, которая есть, скажем, в джаве, — всего лишь синтаксический сахар, который приятно выглядит и заставляет компилятор генерировать ошибки. На самом деле, когда программируешь, прекрасно представляешь, что нужно сделать в этом месте, а тут метод нужно обязательно переопределить, а тут что-то еще сделать.
Чтобы не забыть, в продвинутых в сторону крутости от блокнота ИДЕ есть комментарии "// TODO" или "// FIXME".
Akopalipsis
19.10.2013, 15:43
Спасибо Вам! Почему то мне кажется, что использовать describeType слишком сложно, мне давно интересно, его кто то использует, есть в нем практическая польза? Интерфейсы не заменимы, но я хотел и абстракцию рассмотреть.
КорДум а можно немного о "// TODO" или "// FIXME", что это?
я знаю что можно комментарии, а вот как увидел TODO, то сразу вспомнил, что в FD есть вкладка, где как раз наверное про это.
/**
*
* @param value
*/
А напишите "// todo мое первое туду" и посмотрите, что будет на этой вкладке.
Akopalipsis
19.10.2013, 16:14
я точно знаю, что TODO я видел на вкладке Tasks, но я пишу как Вы показали и нечего там не отображается.
Может не ту панель смотрю?
Вкладка называется Tasks.
http://www.flashdevelop.org/wikidocs/index.php?title=Features:Interface
Akopalipsis
19.10.2013, 16:44
Вообще какой то ужас, где бы я не писал тодо, в панель не чего не выводит, даже если рефреш нажать..
Добавлено через 9 минут
КорДум Спасибо Вам! Появилось, но только не сразу.
caseyryan
19.10.2013, 23:17
Однако, тогда суперкласс не имеет право использовать эти методы внутри себя, ибо он о них совершенно ничего не знает.
Это конечно будет выглядеть бессмысленно, но в суперклассе могут быть такие же методы, и он сможет их использовать, а интерфейс применять будет уже подкласс
KumoKairo
19.10.2013, 23:50
Это конечно будет выглядеть бессмысленно, но в суперклассе могут быть такие же методы, и он сможет их использовать, а интерфейс применять будет уже подкласс
Я кстати как-то раз бессознательно так и сделал. Потом посмотрел со стороны - мозг выносит немного.
vorodis2
21.10.2013, 15:54
//describeType слишком сложно, мне давно интересно, его кто то использует, есть в нем практическая польза?
Я его использую. Офигенная штука. У меня он используеться для просмотра и корректировки любого класса и всех его переменных и методов функций. То есть есть класс спрайта, мы его запоминаем как klass:* распариваем xml там находим скажем x, и если надо заменить то klass["x"]=100; При чем на все слидеры чекбоки и инпут тексты, и любой класс можно смотреть и изменять.
caseyryan
21.10.2013, 20:48
Потом посмотрел со стороны - мозг выносит немного.
Согласен. Я бы так делать не стал. Но возможность-то такая есть.
Я его использую. Офигенная штука. У меня он используеться для просмотра и корректировки любого класса и всех его переменных и методов функций.
А для чего это нужно? Я вот не могу представить ситуации, в которой бы это пригодилось. Можете привести пример?
Akopalipsis
21.10.2013, 21:22
У меня проскользнула мысль о абстрактном классе вот по чему. Модель имплементирует интерфейс IModel и вью в конструкторе получает ссылку на модель с типом IModel. Следующим шагом создается другая под модель имплементирующая интерфейс ISubModel. И когда я создаю под вью, в конструкторе которой указан тип ISubModel, не чего не получается. Вот я и подумал об абстракции, ведь с её типом можно любой интерфейс принять. Но наверное я чего то не понимаю.
caseyryan
22.10.2013, 08:51
Но наверное я чего то не понимаю.
Ваша проблема легко решается, на сколько я понял. Класс не может расширять более одного класса, но интерфейсов может применять сколько угодно. Совершенно не составит никаких проблем написать так:
public class Model extends Object implements IModel, ISubModel {
}
При этом он будет иметь тип данных и IModel и ISubModel
Psycho Tiger
22.10.2013, 11:03
А для чего это нужно? Я вот не могу представить ситуации, в которой бы это пригодилось. Можете привести пример?
Сериализация всех публичных полей модели/VO, например.
Языки везде одни, синтаксис разный вот и все. + плюшки свои есть. Но после AS понять ты сможешь php или JS, например. Но не C# или JAVA .
А после C# или Java ты не сможешь понять Ruby или Haskell. Чувак пишет на чем он пишет, зачем ему что-то навязывать?
vorodis2
22.10.2013, 15:03
//caseyryan
http://vorodis2.com/#id:testKlass
В BigWondowClass можно пихнуть любой класс и визуально опробовать весь его функционал, не делал массивы и функции с параметрами (пока не нужно было, но сделать можно. Затачивал под nape)
Akopalipsis
22.10.2013, 15:15
caseyryan Спасибо! я это знаю, но не будет ли это корявенько немного?
caseyryan
22.10.2013, 16:57
но не будет ли это корявенько немного?
Смотря что там в этих интерфейсах. Само по себе применение нескольких интерфейсов - это вполне нормальная практика. Но вопрос в том, что часто можно множество интерфейсов объединить в один, если функционал подразумевается практически один, как в случае с IModel и ISubModel
А после C# или Java ты не сможешь понять Ruby или Haskell. Чувак пишет на чем он пишет, зачем ему что-то навязывать? Про второй не знаю, но руби понять не такая уж и проблема будет после принцессы. Я говорю о чем стоит задуматься в будущем , всю жизнь на флеше не просидишь все равно. Как по мне лучше переходить на яву, более востребованный чем, например С, хотя опять же смотря где и для чего. Яву знать приятно в связке с флешем, как клиент-серверный, ну а пхп знать особо и не надо, там по справке можно писать спокойной не задумываясь, понятное дело есть ньюансы, но не такие
Psycho Tiger
22.10.2013, 17:44
Про второй не знаю, но руби понять не такая уж и проблема будет после принцессы.
Ты про FiM (http://habrahabr.ru/post/155131/) или ты эдак Джаву обозвал? В любом случае ты настолько не в теме что прямо вообще =) Как повар пошел строить шаттл.
Почему то мне кажется, что использовать describeType слишком сложно, мне давно интересно, его кто то использует, есть в нем практическая польза?
Используется для реализации DI (Dependency Injection), например в RobotLegs. Точнее его недокументированная версия describeTypesJSON с даунгрейдом до describeType в старых версиях плеера.
Akopalipsis
23.10.2013, 00:55
alatar именно из - за RobotLegs2 я о нём и услышал.
Используется для реализации DI (Dependency Injection)
То есть SwiftSuspenders его использует для инжекта?
Именно. Точнее для того, чтобы узнать что и куда инжектить.
Akopalipsis
23.10.2013, 01:06
Именно. Точнее для того, чтобы узнать что и куда инжектить.
Спасибо! У меня только после Ваших слов картинка его работы сложилась.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.