![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Цитата:
Цитата:
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(); } } А, -De-! Вы наверное имеете в виду, что человек из-за невнимательности может поналепить везде super, не зная что на самом деле происходит? Тогда лучше от них отказаться... Добавлено через 14 минут Вернее не отказаться, а понять что это такое и где их нужно использовать, а где нет...
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 29.02.2012 в 01:15. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Об этом, собственно, и речь – не надо писать super везде, где вызывается метод суперкласса.
UPD: Надо писать только тогда, когда метод суперкласса вызывается в функции, которая может быть переопределена, то есть во всех кроме приватных.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 29.02.2012 в 04:01. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Цитата:
Цитата:
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"); } } Цитата:
Для super вполне есть обьяснения, почему надо его писать - "подчеркиваем, что это вызов именно метода базового класса". Просто есть вот и другие соображения. И я даже не претендую на то, что мои лучше. Просто нигде кроме как "тут" super всюду не лепят и я вот пытаюсь обьяснить, почему %)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Я указываю и this и super.
Цитата:
__________________
местонахождение |
|
|||||
|
[+4 06.05.14]
|
писать super нужно только тогда, когда это требуется, писать super, который и так срабатывает в пустом конструкторе считаю глупостью, а this для тех, кто не умеет нормально оформлять код и идей кроме как писать var a:int = 0 , func(a:int) this.a = a , не хватает. Обсуждение считаю глупым
__________________
Марк Tween |
|
|||||
|
Цитата:
Только вот не пойму кому может прийти в голову везде писать "super"... "this" я Теперь в коде мне нужно кое-что дописать: присвоить некоему свойству класса некое значение. А как свойство называется? А фиг его знает... Опять кручу колесико вверх к началу класса. Среди 50 строчек месива из асдоков и переменных ищу нужную мне и снова кручу вниз к месту редактирования кода. А если она не в этом классе, а в базовом? Зачем все это? Не проще написать: "this." и из подсказок выбрать нужную мне вещь. И когда таких случаев много, я начал задумываться: а не начать ли писать код как-то однотипно? Теперь, открыв один из своих старых классов, мне нужно лишь мельком взглянуть и я уже приблизительно вижу что происходит и кто с чем чего делает. this._prop - приватная или protected переменная или константа. this.prop - метод или свойство класса/суперкласса. prop - локальная переменная. Разве не удобочитаемо и красиво? Добавлено через 6 минут Цитата:
Ну, я пользуюсь FlashDevelop и при создании нового класса отмечаю "Generate constructor matching base class" уже не задумываясь, потому что очень часто именно этот super() в конструкторе был нужен.
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 29.02.2012 в 03:10. |
|
|||||
|
[+4 06.05.14]
|
Цитата:
Цитата:
__________________
Марк Tween |
|
|||||
|
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); |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:22. |
|
|
« Предыдущая тема | Следующая тема » |
|
|