Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Предназначение super() (http://www.flasher.ru/forum/showthread.php?t=211787)

Godwarlock 07.11.2015 05:15

Предназначение super()
 
Всем привет. Вот встал вопрос. Объясните предназначение суперкласса в проектах? Ну и что, что он вызывает родительскую версию конструктора, но собственно для чего? Какой смысл?

DEVORON 07.11.2015 06:18

В ActionScript 3, super можно вызывать в любом месте конструктора. Например
Код AS1/AS2:

package {
public class SubClass extends SuperClass {
protected var value:int;
public function SubClass(value:int = 0) {
this.value = value;
super(20);
}
}
}


При перекрытии имеет значение. Перекрытием (overriding) называется переопределение метода в классе, который в противном случае был бы унаследован. Новый метод будет использоваться вместо унаследованного (хотя унаследованный метод остается доступен с использованием super).

caseyryan 07.11.2015 08:49

Цитата:

Объясните предназначение суперкласса в проектах? Ну и что, что он вызывает родительскую версию конструктора, но собственно для чего? Какой смысл?
Когда создается свой класс, он наследуюе все свойства другого (суперкласса). Даже если не написать extends, он все равно по умолчанию будет наследовать свойства класса Object. Так вот чтобы все эти свойства суперкласса стали доступны, их тоже нужно создать. А так как класс создается вызовом конструктора, его необходимо вызвать. Если конструктор суперкласса не принимает никаких аргументов, то вызывать super() вручную не обязательно. Флеш плеер вызовет его автоматически.
Код AS3:

В ActionScript 3, super можно вызывать в любом месте конструктора.

Не всегда. Например если поставить throw перед вызовом конструктора суперкласса, то эту конструкцию он не пропустит. Поэтому лучше всегда ставить super() первым делом. Тем более что во многих других языках, он обязательно должен быть в самом начале, не надо вырабатывать плохую привычку

udaaff 07.11.2015 12:30

Цитата:

не надо вырабатывать плохую привычку
Не вижу ничего плохого в том, чтобы выполнить какие-то действия перед super(), если необходимо.

caseyryan 07.11.2015 13:24

Цитата:

Не вижу ничего плохого в том, чтобы выполнить какие-то действия перед super(), если необходимо.
Например? Что может быть необходимо выполнить перед вызовом super()? Уверен, что любой пример здесь будет просто пимером плохой архитектуры.
Да и, повторюсь, это невозможно сделать во многих других языках. Зачем привыкать делать не правильно?

udaaff 07.11.2015 13:44

Цитата:

Зачем привыкать делать не правильно?
Может быть для меня это "правильно" так как я не знаю множество других языков? :) В чем неправильность заключается в контексте AS3.0, ну или в программировании в целом, в той части которая пересекается с AS3.0?

Пример:
В суперконструкторе вызывается протектед метод init(). В наследнике в конструктор передаются параметры, которые я хочу использовать в переопределенном методе init().

Godwarlock 07.11.2015 13:47

Всем спасибо за ответы, частично разобрался)

caseyryan 07.11.2015 14:59

Цитата:

Сообщение от udaaff (Сообщение 1188771)
Может быть для меня это "правильно" так как я не знаю множество других языков? :) В чем неправильность заключается в контексте AS3.0, ну или в программировании в целом, в той части которая пересекается с AS3.0?

Пример:
В суперконструкторе вызывается протектед метод init(). В наследнике в конструктор передаются параметры, которые я хочу использовать в переопределенном методе init().

Вот, это как раз пример не правильной архитектуры. Сделай сеттеры для всех свойств, которые тебе нужно использовать, и назнач их через сеттеры. А что если в адоби вдруг захотят сделать "правильно" и запретят вызов метода super() после какой-то кода в коснтрускторе? Все приложения, где это есть сразу сломаются. Хотя правильно сделать можно уже сейчас.
А не правильный такой подход исходя из чистой логики. Как с домом, ты пытаешься крыть крышу, не построив стены

udaaff 07.11.2015 15:24

Не верная метафора крыша/стены. Дочерний класс строит не крышу, а вносит свои изменения и дополнения в строй материалы и методы их использования для построения этих самых стен. Крыша не является стеной, наследуюясь от стены, она бы являлось таковой. Более того, запись нескольких значений, никак не влияет на построение стен, значения относятся только к наследнику, что не расходится даже с твоей метафорой. Поэтому не убедил меня твой довод :)

Цитата:

А что если в адоби вдруг захотят сделать "правильно" и запретят вызов метода super() после какой-то кода в коснтрускторе? Все приложения, где это есть сразу сломаются. Хотя правильно сделать можно уже сейчас.
И тут мы плавно возвращаемся к теме, что сотона победил, флеш мертв, и приходится портировать as3 на какого-нибудь уродца на костылях. И да, по поводу правильности тоже вопросы остались.

undefined 07.11.2015 15:32

Цитата:

А что если в адоби вдруг захотят сделать "правильно"
С тем же успехом адоби может вообще отказаться от обратной совместимости.Программист опасная профессия =)


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

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