![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Modus ponens
|
Я пишу this всегда, тогда когда оно есть. Почему - у меня руки от этого не отвалятся, а в редких случаях это помогает избегать неочевидного поведения при наследовании и переопределении. Просто, по логике обычно хочется, чтобы, если явно не указано, методы использовали "родные" а не переопределенные копии. А по умолчанию получается наоборот.
Представте ситуацию: Классс EventDispatcher определил dispatchEvent "внучатый" класс его переопределил так, что он выбрасывает исключение, но внутри "ребенка" EventDispatcher'a были и другие функции, которые заввисели от использования dispatchEvent - так что после переопределения одной функции нарушилась работа и еще и остальных. Естесственно, все это произойдет если ребенок не использует super. Вообще, переопределение зря так просто реализовано. С его помощью очень часто пытаются решить проблемы, которые лучше решать по-другому. Поэтому, я восновном пишу super, и редко this. this в том случае если явно подразумевается, что метод должен переопределятся в ребенке (аналог virtual). Еще такой момент. this это не ключевое слово, это переменная, просто компилятор сам заполняет значение этой переменной. Ключевое слово, это, например, for, var и т.д. - т.е. это не "идентификатор". Вы можете мысленно внутри каждого метода класса просто представлять, что вместо вас компилятор дописывает: var this:ThisClass = {ссылка на объект, которому "принадлежит" метод}.
__________________
Hell is the possibility of sanity |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Немного распутаю то, что написал wvxvw.
Есть некий класс А. У него есть метод method. Вы наследуете этот класс в своем классе В. Спокойно используете унаследованный method в своих функциях. Вызываете его как method или (что тоже самое) как this.method. Затем вы рещаете расширить свой класс В и пишете класс С. В классе С вы переопределяете method для новых фишек класса С. С этих пор все функции класса В, использовавшие method или this.method, будут вызывать метод класса С, а не А, как вы задумывали, когда писали класс В. Надеюсь это понятный повод использовать super везде, где вызывается суперметод, даже если кажется что в данный момент разночтения невозможны. Их могут внести потомки.
__________________
Reality.getBounds(this); |
|
|||||
|
Это такой же понятный повод не использовать super везде. Что в описанной ситуации делать, если надо что бы вызывался именно переопределенный метод?
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Jan 2012
Сообщений: 35
|
Вообще-то слово this положено писать обязательно, если обращаешься к свойству класса внутри него. AS3 позволяет во многих случаях быть безалаберным и не указывать this явно. Компилятор умеет разруливать во многих случаях такую ситуацию. Но в целом это плохая практика. Другие языки программирования как правило не позволяют писать так безалаберно.
Стандарты промышленного кодирования в конторах обычно не разрешают не писать this. То бишь неявное обращение к свойствам класса не приветствуется. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Цитата:
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
По моему тут все зависит от реализации транслятора. Когда начинал учить с++ никак не мог подобрать книгу и компилятор к ней (не било у меня тогда доступа к и-нету). Вот и приходилось експериментировать.
Добавлено через 2 минуты Самое что запомнилось, так это первый мой прокол. В книге было написано а борландовский Турбо Си++ хотел Добавлено через 3 минуты Думаю ето может касаться и this. |
|
|||||
|
У меня такое правило: если в классе есть определение метода:
то обращение к нему в этом классе выглядит так: Если же определения метода в классе нет, то обращение выглядит так:
__________________
...вселенская грусть |
|
|||||
|
Lorem ipsum
|
Всегда пишу super и this. Выбор "надо"/"не надо" отнимает время впустую.
__________________
Поймай яблоко 2! |
|
|||||
|
Все написанное ниже - это мое личное мнение и любое оспаривание моих слов... по крайней мере буду стараться игнорировать.
В посте №20 Wolsh меня шокировал. Знал что-то про наследование про то что подклассы - это классы с бöлбшим количеством свойств, но дальше не лез. Что бы там не говорили, теперь буду везде писать и this и super, а теперь и более серьезно относится к этим вещам. Руки от этого не отпадут, конвенция этого не запрещает. Мало того, считаю это хорошим тоном ЯВНО указывать к КОМУ ты обращаешься. ООП - он на то и ООП, что ты обращаешься к ОБЪЕКТАМ, а не к призракам. Это как писать точку с запятой в конце выражения, без которой можно и обойтись (это пример - не примите за новую ветку флуда; знаю что в случае с точкой с запятой есть объективные преимущества). Не знаю, обратил ли кто-то внимание на мои слова несколькими постами выше: у this действительно есть преимущества: скорость написания/чтения кода (сниппеты/распознавание переменных). А слова:
Цитата:
На вопрос топикстартера: Цитата:
Добавлено через 10 минут Хотя, признаю что пример со скобой - плохой. Конвенция говорит, что надо писать в новой строчке, а я сам же дальше написал: "...если его стиль не нарушает правил...". Ну, что же - слово не воробей... Но, думаю, смысл понятен ![]()
__________________
Я мало чего умею, но зато хорошо умею учиться... |
![]() |
![]() |
Часовой пояс GMT +4, время: 04:10. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|