![]() |
Предназначение super()
Всем привет. Вот встал вопрос. Объясните предназначение суперкласса в проектах? Ну и что, что он вызывает родительскую версию конструктора, но собственно для чего? Какой смысл?
|
В ActionScript 3, super можно вызывать в любом месте конструктора. Например
Код AS1/AS2:
При перекрытии имеет значение. Перекрытием (overriding) называется переопределение метода в классе, который в противном случае был бы унаследован. Новый метод будет использоваться вместо унаследованного (хотя унаследованный метод остается доступен с использованием super). |
Цитата:
Код AS3:
|
Цитата:
|
Цитата:
Да и, повторюсь, это невозможно сделать во многих других языках. Зачем привыкать делать не правильно? |
Цитата:
Пример: В суперконструкторе вызывается протектед метод init(). В наследнике в конструктор передаются параметры, которые я хочу использовать в переопределенном методе init(). |
Всем спасибо за ответы, частично разобрался)
|
Цитата:
А не правильный такой подход исходя из чистой логики. Как с домом, ты пытаешься крыть крышу, не построив стены |
Не верная метафора крыша/стены. Дочерний класс строит не крышу, а вносит свои изменения и дополнения в строй материалы и методы их использования для построения этих самых стен. Крыша не является стеной, наследуюясь от стены, она бы являлось таковой. Более того, запись нескольких значений, никак не влияет на построение стен, значения относятся только к наследнику, что не расходится даже с твоей метафорой. Поэтому не убедил меня твой довод :)
Цитата:
|
Цитата:
|
Цитата:
Не должен подкласс создаваться раньше суперкласса. Как тебе еще такая метафора: "потомок рождается раньше предка, потому что ему нужны новые черты лица, которых у предка не было") Она сюда подходит как нельзя лучше. Даже названия те же) Цитата:
|
Ты рассуждаешь о композиции, а не о наследовании. Когда кот мурзик рождается на свет, то это одно целое - кот. Он не выходит по частям: сначала появилось некое животное, а потом к нему приклеили усы и хвост. Нет это просто кот, он не рождается позже или раньше кого-то, он сам по себе. И являясь животным, при этом он обладает своими собственными свойствами и поведением, которое у "базового животного" может отличаться или отсутствовать. Поэтому кот, как целое, волен вызывать суперконструктор, исходя из своего собственного поведения. В конце концов конструктор - это тот же метод как и прочие. А если переопределив какой-то метод нам необходимо вызвать внутри этого метод супер версию, то мы обязаны, следую твоей логике, делать этот вызов исключительно вначале? Или, все же исходя из того, какое поведение тебе нужно получить?
upd: Другое дело, что до рождения кота, мы не можем его заставить ходить или мяукать, поэтому нет смысла вызывать мяу(), до того как кот будет создан, но сам процесс создания мы можем контролировать. |
udaaff, можешь привести пример "необходимых перед вызовом super()" действий?
|
|
|
Чем тебя пример не устраивает?
|
Тем, что он какой-то нелепый. Независимо от того, что ты хочешь переопределить, все равно будет вызван super() и родительский init(). Таким образом никакой необходимости делать что-то до super() все еще не видно.
|
Речь идет о переопределенном методе init().
Код AS3:
|
А такой пример?
Код AS3:
|
Цитата:
А вот Wolsh привел хороший пример, да. |
а разве можно менять сигнатуру конструктора?
|
А как бы мы иначе делали самодельный Event с data:* в конструкторе!
|
а ну да. Хотя я обычно пишу data в паблик секции.
|
Цитата:
|
.. как бы мы делали любой наследник Спрайта с параметрами в конструкторе ;)
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Переопределенный метод должен вызвать ты сам, в новом конструкторе или еще как-то. Мне это не кажется, я почти уверен :)
|
Цитата:
Все равно твой подход не верный. Пример Wolsh'a тоже не является доказательством правильности такого подхода. Можно вызывать super() c параметрами по умолчанию, а потом назначить все опции окна через сеттеры. В том же конструкторе. И окно сразу появится с нужным видом. Такие сеттеры должны быть, иначе это недоработка какая-то. Кто-то сейчас по-любому подумает "зачем сначала создавать окно с видом по умолчанию, а потом его менять?" Но я отвечу так: чтобы была более чистая и правильная архитектура. В том же MVC делается часто много "лишней" работы. Зачем передавать какие-то модели, виды, котроллеры, когда можно легко все писать в одном "классе-полотенце" и по-максимуму использовать всякие глобальные переменные. Все из-за той же правильной архитектуры. В общем, спорить у меня как-то настроения нет. Я считал и буду считать этот подход не правильным, и никто мне не докажет обратного) |
Цитата:
Что-то пришел на ум такой пример. Обрати внимание, как вызывается метод execute(). Цитата:
Цитата:
А что неверно в твоем подходе, так это плодить лишние сущности без всякой на то объективной причины. |
Цитата:
Цитата:
Или ты не согласен с тем, что это просто логично, что сначала создается объект стоящий в цепочке наледования раньше? А почему не стоит к этом привыкать, ну это субъективно. Я помимо as3 часто пишу на Java, там так сделать нельзя. Поначалу я тоже писал super() где попало в констуркторе. В джаве это сразу падало с ошибкой еще на этапе компиляции. И решил привыкнуть везде писать super() в самом начале кода. Теперь на автомате пишу это без ошибок Цитата:
п.с. В as3 этот super вообще как-то через энное место реализован |
Цитата:
Как я это понимаю (имхо). Нету никакой иерархии в наследнике. Он унаследовал от своего предка (или своих предков, их может быть сколько угодно, а если тут подумать о множественном наследовании?) его свойства и методы. Это теперь свойства и методы наследника, ни кота папы или мамы, его собственные, равноправные, находящиеся на одном уровне. И у наследника может быть свой порядок инициализации, т.е. отличный от его предков. Ему не надо сначала инициировать какую-то основу в нем, он не составлен из модулей, стоящих один на другом, он одно целое. Если метод инициализации подразумевает вызов какой-то унаследованной "основы", ну так это решать исключительно наследнику, исходя из своих надобностей. Ты приводил пример с домом как основой и навешиванием на него всяких прибамбасов. И то, что не построив дома, к нему не прилипить сигнализацию. Я же говорю о расширении (дополнении и переопределении) концепции "дом". К примеру дом->детский сад. А не дом->дом с окном и дверью. В первом случае мы же не стоим дом, которые затем превращаем в дет.сад, нет, мы сразу строим дет.сад. А вот втором да, чтобы навесить на дом ручку и бантик, нам нужно его построить, и это в моем понимании композиция. |
| Часовой пояс GMT +4, время: 11:08. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.