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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.01.2011, 18:11
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 1  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
По умолчанию Предок не приводится к наследнику. Почему?

Хочу расширить Array. Почитал Мука, посмотрел хелп. Сделал так:
Код AS3:
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;
  }
 
}
А это не работает:
Код AS3:
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
как можно создать объект MyArray из объекта Array ?
и в чем разница ... as MyArray и MyArray (...) ?

Старый 19.01.2011, 18:55
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 2  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Код AS3:
public dynamic class MyArray extends Array 
{	
	public function MyArray(... args) 
	{
		super();
		for (var i:int = 0 ; i < args.length ; i ++ ) {
			this.push(args[i]);
		}		
	}	
}
Код AS3:
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
А как заставить чтоб работало:
Код AS3:
var arr:MyArray = [1, 2, 3, 4]
Я не знаю

Добавлено через 5 минут
Цитата:
делай

Код AS3:

public function MyArray(... args)
{
super(args);
}
Нет. не делай Этот код всунет тебе в первый элемент массива, тот массив который ты ему вручил в конструкторе.

например если сделаешь вот так:
Код AS3:
var my_arr:MyArray = MyArray ([null, null, 2, 3]);
то получишь такую конструкцию:
Код:
1. [null, null, 2, 3]
а потом если сделаешь к примеру:
Код AS3:
my_arr.push(22);
my_arr.push(33);
my_arr.push(44);
то получится примерно следующее:
Код:
1. [null, null, 2, 3]
2. 22
3. 33
4. 44
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 19.01.2011, 19:21
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 3  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
Спасибо за помощь!
Немного переделал, теперь у меня так:

Код AS3:
public dynamic class MyArray extends Array
{
 
  public function MyArray(arr:Array)
  {
    arr.forEach(this.push_element);
  }
 
  private function push_element(element:*, index:int, arr:Array):void {
    this.push(element);
  };
}
 
var my_arr:MyArray = new MyArray([null, null, 2, 3]);

Старый 19.01.2011, 19:22
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 4  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: 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

Старый 19.01.2011, 19:25
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 5  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
Простите, а с чего массив должен реализовывать методы, объявленные в его наследнике?

Ну, я подумал, а почему бы за кулисами при приведении массива к моему массиву автоматом не прикручивались бы дополнительные методы. Ведь переменных экземпляра я не объявлял.

Старый 19.01.2011, 19:48
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 6  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Код AS3:
public dynamic class MyArray extends Array {
	public function MyArray(...args) {
		super();
		super.push.apply( null, args );
	}
}

Старый 19.01.2011, 19:58
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 7  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
По умолчанию Потому, что нельзя

Потому, что это противоречит концепции ООП. Предок в принципе не может приводиться к наследнику. А сделать так, как вы желаете нельзя.

Код AS3:
var testMyArr:MyArr = [1, 2, 3];   <=>   var testMyArr:MyArr = new Array(1, 2, 3);
Вот если бы в AS3 можно было перегружать операторы, или были бы макросы - пожалуйста... Хотя, и тогда не совсем.


Последний раз редактировалось semenyakinVS; 19.01.2011 в 20:22. Причина: Убрал неправильные квадратные скобочки
Старый 19.01.2011, 20:02
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 8  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Код AS3:
  public function MyArray(arr:Array)
  {
    arr.forEach(this.push_element);
  }
Вот этого делать необязательно. "args" - уже и так сам по себе массив. можно писать вот так:
Код AS3:
  public function MyArray(... args)
  {
    args.forEach(this.push_element);
  }
ну и BlooDHounD поизящнее метод предложил, вне конкуренции
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 19.01.2011, 20:05
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 9  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
Код AS3:
super.push.apply( null, args );
Это круто! И при этом инициализация делается вот так:
Код AS3:
var my_arr:MyArray = new MyArray(null,null,2,3);
Добавлено через 3 минуты
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
Вот этого делать необязательно. "args" - уже и так сам по себе массив.
точно

Добавлено через 10 минут
Цитата:
Сообщение от semenyakinVS Посмотреть сообщение
Потому, что это противоречит концепции ООП. Предок в принципе не может приводиться к наследнику.
Это понятно, но согласитесь, в простом случае, когда конструктор явно не объявлен в наследнике (компилятору известно, что новых переменных экземпляра нет), казалось бы чисто технически ничто не мешает реализовать в компиляторе такое приведение предка к потомку. Просто прикрутить к даным экземпляра расширенную потомком таблицу методов. ?

Старый 19.01.2011, 20:19
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 10  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
Код AS3:
var arr:MyArray = new MyArray(1, 2, 3, 4);
 
arr[5] = 6;
trace(arr);
//1,2,3,4,5,6
Оператор [] будет работать в таком случаи? Это хорошо...

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

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

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


 


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


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