![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Хочу расширить Array. Почитал Мука, посмотрел хелп. Сделал так:
public dynamic class MyArray extends Array { public function MyArray(... args) { } public function compact():Array { var arr:Array = this.filter( function (element:*, index:int, arr:Array):Boolean { return (element != null); }) return arr; } } var my_arr:MyArray = [null, null, 2, 3]; //Пишет: Implicit coercion of a value with static type Array to a possibly //unrelated type utils:MyArray. var my_arr:MyArray = MyArray ([null, null, 2, 3]); //Пишет rte: [Fault] exception, information=TypeError: Error #1034: //Ошибка типа Coercion: невозможно преобразовать []@156d291 в utils.MyArray var my_arr:MyArray = [null, null, 2, 3] as MyArray; // Не ругается, но my_arr равен null и в чем разница ... as MyArray и MyArray (...) ? |
|
|||||
public dynamic class MyArray extends Array { public function MyArray(... args) { super(); for (var i:int = 0 ; i < args.length ; i ++ ) { this.push(args[i]); } } } var arr:MyArray = new MyArray(1, 2, 3, 4); trace(arr); //1,2,3,4 arr.push(5); trace(arr); //1,2,3,4,5 arr[5] = 6; trace(arr); //1,2,3,4,5,6 Я не знаю ![]() Добавлено через 5 минут Цитата:
Этот код всунет тебе в первый элемент массива, тот массив который ты ему вручил в конструкторе.например если сделаешь вот так: то получишь такую конструкцию: а потом если сделаешь к примеру: то получится примерно следующее:
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Спасибо за помощь!
Немного переделал, теперь у меня так: |
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Простите, а с чего массив должен реализовывать методы, объявленные в его наследнике? Вы пишете var arr:MyArray = new Array(). Array не наследует поведение MyArray, в то время как MyArray поведение Array — наследует. Следовательно, вот так будет работать: var arr:Array = new MyArray(); а так: var arr:MyArray = new Array() — нет.
__________________
#flasher@irc.trg.ru:6667 |
|
|||||
|
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Простите, а с чего массив должен реализовывать методы, объявленные в его наследнике?
Ну, я подумал, а почему бы за кулисами при приведении массива к моему массиву автоматом не прикручивались бы дополнительные методы. Ведь переменных экземпляра я не объявлял. |
|
|||||
|
стервочка (я мужик)
|
|
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
Потому, что это противоречит концепции ООП. Предок в принципе не может приводиться к наследнику. А сделать так, как вы желаете нельзя.
Вот если бы в AS3 можно было перегружать операторы, или были бы макросы - пожалуйста... Хотя, и тогда не совсем. Последний раз редактировалось semenyakinVS; 19.01.2011 в 20:22. Причина: Убрал неправильные квадратные скобочки |
|
|||||
|
Вот этого делать необязательно. "args" - уже и так сам по себе массив. можно писать вот так:
ну и BlooDHounD поизящнее метод предложил, вне конкуренции ![]()
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
|
Это круто! И при этом инициализация делается вот так:
Добавлено через 3 минуты Цитата:
Добавлено через 10 минут Это понятно, но согласитесь, в простом случае, когда конструктор явно не объявлен в наследнике (компилятору известно, что новых переменных экземпляра нет), казалось бы чисто технически ничто не мешает реализовать в компиляторе такое приведение предка к потомку. Просто прикрутить к даным экземпляра расширенную потомком таблицу методов. ? |
|
|||||
|
Регистрация: Mar 2010
Сообщений: 137
|
Оператор [] будет работать в таком случаи? Это хорошо...
|
![]() |
![]() |
Часовой пояс GMT +4, время: 23:06. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|