![]() |
Что дает употребление this в не динамических классах?
Собственно, сабж. Никогда не пользовался в не динамических классах, но часто вижу употребление другими этого ключевого слова везде, где только можно. Это что-то дает? И, если дает, то что? А если не дает, зачем использовать? Спасибо.
UPD. Наверное это мега-нубский вопрос, но я в упор не понимаю, зачем использовать this. Объясните мне, люди! |
Цитата:
Являюсь сторонником this. Намного удобнее читать код (лично мне) - сразу определяешь где свойство/метод класса или суперкласса, а где локальная переменная. |
Загуглите, что такое this.
Из этого всё растёт. Из других неочевидных - чтобы различать переменные класса и локальные. Код AS3:
PS: this хоть безопасен, а вот super лучше не писать, это какое-то легкое помешательство чисто местных флешеров. |
Цитата:
|
Пишу только то что нужно и когда нужно (this, super). Никакого дискомфорта от этого не испытываю.
|
Если в классе (или его наследниках), где везде писалось super.method() method всё-таки кто-то перегрузит, то придется от этого super избавляться.
super пишут либо если method уже перегружен и таки хочется вызвать метод базового класса - собсно для этого super сделан. Либо если |
-De-, чего - то я немного не догнал, что ты подразумеваешь под
Цитата:
|
Перегрузки в АС3 нет, поэтому логично предположить, что имеется в виду переопределение. -De-, можешь обьяснить, что это значит:
Цитата:
Код AS3:
Код AS3:
|
override, конечно.
HardCoder, написать, конечно, можно (extends не забыть только), но вот в данном примере super.method(); вызовется дважды. И ещё представьте, что в SomeClass есть куча методов типа func1. И в них захотелось вызывать новый method(); старый уже не тот. Захотел сделать свой дисплей лист с addChild, но везде super.addChild. |
Когда изучал АС3, то пользовался флешовой идехой и, конечно, код писал в кадрах. Там this я лепил где только можно было - это помогало получать контекстно зависимый автокомплит
|
Цитата:
Код AS3:
Цитата:
Код AS3:
Код AS3:
А, -De-! Вы наверное имеете в виду, что человек из-за невнимательности может поналепить везде super, не зная что на самом деле происходит? Тогда лучше от них отказаться... Добавлено через 14 минут Вернее не отказаться, а понять что это такое и где их нужно использовать, а где нет... |
Об этом, собственно, и речь – не надо писать super везде, где вызывается метод суперкласса.
UPD: Надо писать только тогда, когда метод суперкласса вызывается в функции, которая может быть переопределена, то есть во всех кроме приватных. |
Цитата:
Цитата:
Код AS3:
Цитата:
Для super вполне есть обьяснения, почему надо его писать - "подчеркиваем, что это вызов именно метода базового класса". Просто есть вот и другие соображения. И я даже не претендую на то, что мои лучше. Просто нигде кроме как "тут" super всюду не лепят и я вот пытаюсь обьяснить, почему %) |
Я указываю и this и super.
Цитата:
|
писать super нужно только тогда, когда это требуется, писать super, который и так срабатывает в пустом конструкторе считаю глупостью, а this для тех, кто не умеет нормально оформлять код и идей кроме как писать var a:int = 0 , func(a:int) this.a = a , не хватает. Обсуждение считаю глупым
|
Цитата:
Только вот не пойму кому может прийти в голову везде писать "super"... "this" я Теперь в коде мне нужно кое-что дописать: присвоить некоему свойству класса некое значение. А как свойство называется? А фиг его знает... Опять кручу колесико вверх к началу класса. Среди 50 строчек месива из асдоков и переменных ищу нужную мне и снова кручу вниз к месту редактирования кода. А если она не в этом классе, а в базовом? Зачем все это? Не проще написать: "this." и из подсказок выбрать нужную мне вещь. И когда таких случаев много, я начал задумываться: а не начать ли писать код как-то однотипно? Теперь, открыв один из своих старых классов, мне нужно лишь мельком взглянуть и я уже приблизительно вижу что происходит и кто с чем чего делает. this._prop - приватная или protected переменная или константа. this.prop - метод или свойство класса/суперкласса. prop - локальная переменная. Разве не удобочитаемо и красиво? Добавлено через 6 минут Цитата:
Цитата:
|
Цитата:
Цитата:
|
СлаваRa прав. Надо или закрывать тему, или переносить ее во флейм.
|
Я пишу this всегда, тогда когда оно есть. Почему - у меня руки от этого не отвалятся, а в редких случаях это помогает избегать неочевидного поведения при наследовании и переопределении. Просто, по логике обычно хочется, чтобы, если явно не указано, методы использовали "родные" а не переопределенные копии. А по умолчанию получается наоборот.
Представте ситуацию: Классс EventDispatcher определил dispatchEvent "внучатый" класс его переопределил так, что он выбрасывает исключение, но внутри "ребенка" EventDispatcher'a были и другие функции, которые заввисели от использования dispatchEvent - так что после переопределения одной функции нарушилась работа и еще и остальных. Естесственно, все это произойдет если ребенок не использует super. Вообще, переопределение зря так просто реализовано. С его помощью очень часто пытаются решить проблемы, которые лучше решать по-другому. Поэтому, я восновном пишу super, и редко this. this в том случае если явно подразумевается, что метод должен переопределятся в ребенке (аналог virtual). Еще такой момент. this это не ключевое слово, это переменная, просто компилятор сам заполняет значение этой переменной. Ключевое слово, это, например, for, var и т.д. - т.е. это не "идентификатор". Вы можете мысленно внутри каждого метода класса просто представлять, что вместо вас компилятор дописывает: var this:ThisClass = {ссылка на объект, которому "принадлежит" метод}. |
Немного распутаю то, что написал wvxvw.
Есть некий класс А. У него есть метод method. Вы наследуете этот класс в своем классе В. Спокойно используете унаследованный method в своих функциях. Вызываете его как method или (что тоже самое) как this.method. Затем вы рещаете расширить свой класс В и пишете класс С. В классе С вы переопределяете method для новых фишек класса С. С этих пор все функции класса В, использовавшие method или this.method, будут вызывать метод класса С, а не А, как вы задумывали, когда писали класс В. Надеюсь это понятный повод использовать super везде, где вызывается суперметод, даже если кажется что в данный момент разночтения невозможны. Их могут внести потомки. |
Цитата:
Цитата:
Код AS3:
Цитата:
Цитата:
Цитата:
котором был определен метод прослушивателя. Иными словами, если вы пользовались этим методом в ActionScript 2.0, ключевое слово this будет относиться к компоненту, осуществляющему широковещательную рассылку события, а не к экземпляру ChildSprite." Но справедливости ради надо отметить, что this еще именуется в документации как ссылка (на той же 109 странице, например), поэтому, я не могу быть увереным в своём понимании. |
Цитата:
UPD: вроде так и не поняли, что же это такое. this - это экземпляр класса, в методе которого этот this написан. Статики живут глобально и отдельно от экземпляров класса (чтоб их вызывать не нужно создавать экземпляр класса, например), нет экземпляра - нет this. Переменные типа класса - все ссылки, потому this - это тоже ссылка (т.е. при присвоении а = б, если а и б - классы, то копирование класса б не происходит, а а и б ссылаются на один обьект и если менять а, то будет меняться и б). Если что - поищите примеры использования %) И учите, блин, язык, а то чую написал китайскую грамоту =\ |
Вообще-то слово this положено писать обязательно, если обращаешься к свойству класса внутри него. AS3 позволяет во многих случаях быть безалаберным и не указывать this явно. Компилятор умеет разруливать во многих случаях такую ситуацию. Но в целом это плохая практика. Другие языки программирования как правило не позволяют писать так безалаберно.
Стандарты промышленного кодирования в конторах обычно не разрешают не писать this. То бишь неявное обращение к свойствам класса не приветствуется. |
Оффтоп:
Цитата:
|
По моему тут все зависит от реализации транслятора. Когда начинал учить с++ никак не мог подобрать книгу и компилятор к ней (не било у меня тогда доступа к и-нету). Вот и приходилось експериментировать.
Добавлено через 2 минуты Самое что запомнилось, так это первый мой прокол. В книге было написано Код:
#include <iostream>Код:
#include <iostream.h>Думаю ето может касаться и this. |
У меня такое правило: если в классе есть определение метода:
Код AS3:
Код AS3:
Код AS3:
|
Цитата:
|
Всегда пишу super и this. Выбор "надо"/"не надо" отнимает время впустую.
|
Все написанное ниже - это мое личное мнение и любое оспаривание моих слов... по крайней мере буду стараться игнорировать.
В посте №20 Wolsh меня шокировал. :) Знал что-то про наследование про то что подклассы - это классы с бöлбшим количеством свойств, но дальше не лез. Что бы там не говорили, теперь буду везде писать и this и super, а теперь и более серьезно относится к этим вещам. Руки от этого не отпадут, конвенция этого не запрещает. Мало того, считаю это хорошим тоном ЯВНО указывать к КОМУ ты обращаешься. ООП - он на то и ООП, что ты обращаешься к ОБЪЕКТАМ, а не к призракам. Это как писать точку с запятой в конце выражения, без которой можно и обойтись (это пример - не примите за новую ветку флуда; знаю что в случае с точкой с запятой есть объективные преимущества). Не знаю, обратил ли кто-то внимание на мои слова несколькими постами выше: у this действительно есть преимущества: скорость написания/чтения кода (сниппеты/распознавание переменных). А слова: Цитата:
На вопрос топикстартера: Цитата:
Добавлено через 10 минут Хотя, признаю что пример со скобой - плохой. Конвенция говорит, что надо писать в новой строчке, а я сам же дальше написал: "...если его стиль не нарушает правил...". Ну, что же - слово не воробей... Но, думаю, смысл понятен :) |
Цитата:
Код AS3:
|
Цитата:
public static function |
alatar, я подразумевал, что вопрос в том: писать ли this в тех случаях, когда не нужно отличить локальную переменную, а вообще всегда когда нужно и не особо нужно. Посчитал, что о таких очевидных вещах как "отличие локальных переменных" и говорить и надо, так как про this.someValue было сказано еще в начале темы.
Добавлено через 1 минуту Цитата:
|
Zebestov, Вам приходится постоянно выбирать между super и this =) Мне - только в очень особых случаях, потому у меня шанс ошибиться, и не написать super или this когда надо, меньше.
|
Цитата:
|
Цитата:
|
В этом году superсрача еще не было.
|
Мне кажется - я наконец понял что хотел обьяснить -De-. -De-, если я не прав поправьте, пожалуйста: Нельзя писать super, потому что может возникнуть ситуация, которую описал Wolsh. В этой ситуации мне понадобится в наследниках везде вызывать новый (переопределенный) метод, а на самом деле будет вызываться супер метод. Тогда придется все "super" удалять. Я правильно понял?
Тогда возьмем второй пример. Ситуация та же, только вот мне не нужно, чтобы везде вызывался новый (переопределенный) метод, а как раз супер метод (везде, где я раньше написал "super"). Тогда наоборот "super" нужно писать. Что же получается: я иду на рынок за фруктом. Встречаю соседей. Один говроит: - Не покупай яблоко! - Почему? - Потому что, придя домой - ты можешь захотеть съесть грушу. Покупай грушу! Второй сосед говорит: - Не покупай грушу! - Почему? - Потому что, придя домой - ты можешь захотеть съесть яблоко. Покупай яблоко! Я вежливо прощаюсь, иду на рынок и покупаю ТО, что я захочу съесть, когда приду домой. То есть при написании кода, нужно употреблять super или this там, где нужно. |
Цитата:
Код AS3:
|
gait, твой пример не противоречит тому, что привел alatar, он просто не по теме :)
|
Цитата:
|
| Часовой пояс GMT +4, время: 04:45. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.