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

Вернуться   Форум Flasher.ru > Блоги > Идиотизмы

Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Рейтинг: 5.00. Голосов: 3.

Идиотизмы: Sound

Запись от BlooDHounD размещена 07.06.2010 в 17:01
Обновил(-а) BlooDHounD 07.06.2010 в 17:12

для понимания материала необходимы следующие знания:
flash.media.Sound
!true не всегда false


допустим есть класс SSS ( не спрашивайте, почему он такой ):
Код AS3:
package {
 
    import flash.media.Sound;
    import flash.media.SoundLoaderContext;
    import flash.net.URLRequest;
 
    public class SSS extends Sound {
 
        public function SSS() {
            super();
        }
 
        public override function load(stream:URLRequest, context:SoundLoaderContext=null):void {
            throw new Error( 'неверное действие' );
        }
 
    }
 
}
тоесть в классе SSS переопределён метод load.
Код AS3:
var s:SSS = new SSS();
при попытке создать экземпляр класса SSS у нас вывалится следующие сообщение:
Код:
Error: неверное действие
at SSS/load()[D:\__workspace\test\src\test.as:25]
at flash.media::Sound()
at SSS()[D:\__workspace\test\src\test.as:22]
at test()[D:\__workspace\test\src\test.as:10]
вот спрашивается почему адоба посчитала, что метод load у класса Sound надо вызывать обязательно ( даже если в конструкторе передали null )?
хотя в справке чётко написано:
Цитата:
При передаче действительного объекта URLRequest конструктору Sound он автоматически вызывает функцию load() для объекта Sound. Если конструктору Sound не передается действительный объект URLRequest, необходимо самостоятельно вызвать функцию load() для объекта Sound, иначе поток не загрузится.
появление данной ошибки можно легко обойти:
Код AS3:
package {
 
    import flash.media.Sound;
    import flash.media.SoundLoaderContext;
    import flash.net.URLRequest;
 
    public class SSS extends Sound {
 
        public function SSS() {
            if ( !true ) {
                super();
            }
        }
 
        public override function load(stream:URLRequest, context:SoundLoaderContext=null):void {
            throw new Error( 'неверное действие' );
        }
 
    }
 
}
как известно, если не написать super(), он допишется автоматом в начало конструктора. но, если поместить его в не исполняемый блок, всё будет хорошо =)
таким мини-хаком мы блокируем вызов AS3-обёртки класса Sound. сам объект будет создан всё равно.
Всего комментариев 3

Комментарии

Старый 07.06.2010 17:38 iNils вне форума
iNils
 
Аватар для iNils
Возможно проверка на наличие stream стоит в оригинальном load, а не в конструкторе. Хотя конечно странно. Так что, сам хак не особо и нужен, только для того чтобы не дергать load в холостую.
Старый 07.06.2010 19:27 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
именно там она и стоит. и именно для того что бы не дёргался load хак и был нужен.
Старый 21.02.2015 13:07 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Полезная конструкция для обхода вызова конструктора суперкласса
Спасибо.
 

 


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


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