Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 29.02.2012, 01:13
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 11  
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от -De- Посмотреть сообщение
HardCoder, написать, конечно, можно (extends не забыть только), но вот в данном примере super.method(); вызовется дважды.
У меня лишь по разу вызывается:
Код AS3:
var a:SomeClass = new SomeClass();
a.func1();//1 раз
a.method();//один раз
Цитата:
Сообщение от -De- Посмотреть сообщение
И ещё представьте, что в SomeClass есть куча методов типа func1. И в них захотелось вызывать новый method(); старый уже не тот.
Захотелось, вызываем:
Код AS3:
public function func2():void {
	this.method();
}
В итоге:
Код AS3:
public class NewClass1 extends NewClass {
 
	public function func1():void {
		//вызываем метод суперкласса:
		super.method();
	}
 
	public function func2():void {
		//вызываем переопределенный метод
		this.method();
	}
 
	override public function method():void {
		trace("I am overriding my super class method");
		super.method();
	}
}
Добавлено через 2 минуты
А, -De-! Вы наверное имеете в виду, что человек из-за невнимательности может поналепить везде super, не зная что на самом деле происходит? Тогда лучше от них отказаться...

Добавлено через 14 минут
Вернее не отказаться, а понять что это такое и где их нужно использовать, а где нет...
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 29.02.2012 в 01:15.
Старый 29.02.2012, 01:41
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 12  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Об этом, собственно, и речь – не надо писать super везде, где вызывается метод суперкласса. Надо писать только тогда, когда есть this#method, а надо вызвать именно суперский вариант.
UPD: Надо писать только тогда, когда метод суперкласса вызывается в функции, которая может быть переопределена, то есть во всех кроме приватных.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 29.02.2012 в 04:01.
Старый 29.02.2012, 01:51
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 13  
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Цитата:
Сообщение от HardCoder Посмотреть сообщение
У меня лишь по разу вызывается:
Код AS3:
var a:SomeClass = new SomeClass();
a.func1();//1 раз
a.method();//один раз
Итого два. А хочется, чтоб в func1 уже был новый.
Цитата:
Сообщение от HardCoder Посмотреть сообщение
Захотелось, вызываем:[as3]public function func2():void {
this.method();
}
Нет, надо ВЕЗДЕ, а не только в новонаписанной и потому нигде не использующейся func2, ибо возможно уже куча кода понаписана.
Код AS3:
class ololo {//базовый, в нём есть некий метод
	public function lolo():void {
		trace("ololo");
	}
}
class ololo2 extends ololo {
	public function lold():void {//есть куча методов, в куче наследников ololo,
		//которые вызывают super.lolo(); вместо просто lolo()
		super.lolo();
	}
}
class ololo3 extends ololo2 {//потребовалось написать класс, где нужно везде
	//использовать новый метод lolo (и только в нём и его наследниках).
	public override function lolo():void {
		trace("ololo3");
	}
}
Цитата:
Сообщение от HardCoder Посмотреть сообщение
Добавлено через 2 минуты
А, -De-! Вы наверное имеете в виду, что человек из-за невнимательности может поналепить везде super, не зная что на самом деле происходит? Тогда лучше от них отказаться...
ЭЭ какбэ надо вообще всегда для себя уметь обосновать, почему ты написал то, что написал %)
Для super вполне есть обьяснения, почему надо его писать - "подчеркиваем, что это вызов именно метода базового класса". Просто есть вот и другие соображения. И я даже не претендую на то, что мои лучше. Просто нигде кроме как "тут" super всюду не лепят и я вот пытаюсь обьяснить, почему %)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 29.02.2012, 02:15
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 14  
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Я указываю и this и super.
Цитата:
ЭЭ какбэ надо вообще всегда для себя уметь обосновать, почему ты написал то, что написал %)
Я в момент написания всегда знаю куда именно мне надо обратиться (будь то метод суперкласса или свой). И у меня никогда не появляется проблем если я вдруг что-то переопределил. Но мне кажется, что эта тема по большей части религиознаяхоливарная, обсуждалось 100500 раз, к чему-то общему, мы не придем тут никогда.
__________________
местонахождение

Старый 29.02.2012, 02:24
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 15  
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
писать super нужно только тогда, когда это требуется, писать super, который и так срабатывает в пустом конструкторе считаю глупостью, а this для тех, кто не умеет нормально оформлять код и идей кроме как писать var a:int = 0 , func(a:int) this.a = a , не хватает. Обсуждение считаю глупым
__________________
Марк Tween

Старый 29.02.2012, 02:41
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 16  
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от -De- Посмотреть сообщение
Нет, надо ВЕЗДЕ, а не только в новонаписанной и потому нигде не использующейся func2, ибо возможно уже куча кода понаписана.
Так все из-за того, что править код будет сложнее (придется удалять все раньше написанные "super")? Тогда согласен: не надо лепить супер там где без них можно обойтись. Я, просто, думал что есть какая-то опасность при ОСОЗНАННОМ использовании "super" - вот и стало интересно.
Только вот не пойму кому может прийти в голову везде писать "super"...
"this" я леплю осознанно ставлю везде. Расскажу почему. Мне нужно подправить один из очень старых классов. Открываю его: там 10-15 переменных - все облеплены asdoc-ами, в итоге их обьявление занимает 30-50 строк. Лезу вглубь класса. На строчке 280-300 нахожу в нужном методе код, который нужно править. Вижу кучу переменных, что глаза разбегаются. Я же не помню что какая переменная значит. Нужно крутить колесико вверх к началу метода и смотреть не обьявлена ли эта переменная в методе(локальная). Зачем это проделывать, если по this я увижу сразу - локальная это переменная, или переменная класса.
Теперь в коде мне нужно кое-что дописать: присвоить некоему свойству класса некое значение. А как свойство называется? А фиг его знает... Опять кручу колесико вверх к началу класса. Среди 50 строчек месива из асдоков и переменных ищу нужную мне и снова кручу вниз к месту редактирования кода. А если она не в этом классе, а в базовом? Зачем все это? Не проще написать: "this." и из подсказок выбрать нужную мне вещь.
И когда таких случаев много, я начал задумываться: а не начать ли писать код как-то однотипно?
Теперь, открыв один из своих старых классов, мне нужно лишь мельком взглянуть и я уже приблизительно вижу что происходит и кто с чем чего делает. this._prop - приватная или protected переменная или константа. this.prop - метод или свойство класса/суперкласса. prop - локальная переменная. Разве не удобочитаемо и красиво?

Добавлено через 6 минут
Цитата:
Сообщение от in4core Посмотреть сообщение
а this для тех, кто не умеет нормально оформлять код и идей кроме как писать var a:int = 0 , func(a:int) this.a = a , не хватает. Обсуждение считаю глупым
По вашему это единственный случай где this может понадобится?
Цитата:
Сообщение от in4core Посмотреть сообщение
писать super, который и так срабатывает в пустом конструкторе считаю глупостью,
Ну, я пользуюсь FlashDevelop и при создании нового класса отмечаю "Generate constructor matching base class" уже не задумываясь, потому что очень часто именно этот super() в конструкторе был нужен.
__________________
Я мало чего умею, но зато хорошо умею учиться...


Последний раз редактировалось HardCoder; 29.02.2012 в 03:10.
Старый 29.02.2012, 02:59
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 17  
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
"Generate constructor matching base class"
В этом случае да, просто я этой галкой не пользуюсь обычно.

Цитата:
По вашему это единственный случай где this может понадобится?
Я скажу больше, - нет таких случаев где вообще нужен this , кроме как удобочитаемости кода, да и то спорный момент - кому как удобнее опять же, а вот без супера обойтись нельзя
__________________
Марк Tween

Старый 29.02.2012, 03:00
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 18  
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
СлаваRa прав. Надо или закрывать тему, или переносить ее во флейм.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 29.02.2012, 03:01
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 19  
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Я пишу this всегда, тогда когда оно есть. Почему - у меня руки от этого не отвалятся, а в редких случаях это помогает избегать неочевидного поведения при наследовании и переопределении. Просто, по логике обычно хочется, чтобы, если явно не указано, методы использовали "родные" а не переопределенные копии. А по умолчанию получается наоборот.
Представте ситуацию: Классс EventDispatcher определил dispatchEvent "внучатый" класс его переопределил так, что он выбрасывает исключение, но внутри "ребенка" EventDispatcher'a были и другие функции, которые заввисели от использования dispatchEvent - так что после переопределения одной функции нарушилась работа и еще и остальных. Естесственно, все это произойдет если ребенок не использует super.
Вообще, переопределение зря так просто реализовано. С его помощью очень часто пытаются решить проблемы, которые лучше решать по-другому. Поэтому, я восновном пишу super, и редко this. this в том случае если явно подразумевается, что метод должен переопределятся в ребенке (аналог virtual).

Еще такой момент. this это не ключевое слово, это переменная, просто компилятор сам заполняет значение этой переменной. Ключевое слово, это, например, for, var и т.д. - т.е. это не "идентификатор".
Вы можете мысленно внутри каждого метода класса просто представлять, что вместо вас компилятор дописывает: var this:ThisClass = {ссылка на объект, которому "принадлежит" метод}.
__________________
Hell is the possibility of sanity

Старый 29.02.2012, 03:49
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 20  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Немного распутаю то, что написал wvxvw.
Есть некий класс А. У него есть метод method.
Вы наследуете этот класс в своем классе В.
Спокойно используете унаследованный method в своих функциях.
Вызываете его как method или (что тоже самое) как this.method.
Затем вы рещаете расширить свой класс В и пишете класс С.
В классе С вы переопределяете method для новых фишек класса С.
С этих пор все функции класса В, использовавшие method или this.method, будут вызывать метод класса С, а не А, как вы задумывали, когда писали класс В.
Надеюсь это понятный повод использовать super везде, где вызывается суперметод, даже если кажется что в данный момент разночтения невозможны. Их могут внести потомки.
__________________
Reality.getBounds(this);

Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 03:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:22.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.