![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2014
Сообщений: 312
|
На самом деле это продолжение старого топика. Но старый топик стал таким запутанным, что я решил подвести итог и начать новый топик.
Итог: Пример: Человек может купить собаку. При этом он посылает кастомное событие, в котором лежит собака. package { [Event(name = "iBoughtDog", type = "ManEvents")] public class Main { public function Main() { var man:Man = new Man(); man.addEventListener(ManEvent.I_BOUGHT_DOG, listener); } private function listener( сноска* ):void { } } } package { [Event(name = "iBoughtDog", type = "ManEvent")] public class Man { public function Man() { } private function someFunction():void { dispatchEvent( new TransportEvent(dog, ManEvent.I_BOUGHT_DOG) ); } } } package { public class ManEvent { static public const I_BOUGHT_DOG:String = "iBoughtDog"; } } package { import flash.events.Event; public class TransportEvent extends Event { public function TransportEvent(cargo:Object, type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); _cargo = cargo; } public function get cargo():Object { return _cargo; } private var _cargo:Object; } } Для решения проблемы можно отнаследовать ManEvent от TransportEvent и посылать в слушатель именно ManEvent. Но наследование выглядит глупо - ведь мы никак не расширили базовый класс. |
|
|||||
|
Зачем вообще наследовать события? Вполне достаточно унаследовать свой класс от базового класса Event и не городить никаких длинных цепочек.
И зачем передавать эту собаку в конструкторе? Можно сделать у события публичное свойство dog и передавать его туда. п.с. не стоило создавать новую тему |
|
|||||
|
Регистрация: Dec 2014
Сообщений: 312
|
По всему проекту разбросаны кучи однотипных классов.
package { import flash.events.Event; public class SomeEvent extends Event { public function SomeEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } public var something:Something; } } Я решил удалить все эти классы, и создал TransportEvent, который несет нетипизированный объект. |
|
|||||
|
Цитата:
Добавлено через 7 минут у пришедшего события (TransportEvent) будет type == ManEvent.I_BOUGHT_DOG
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
Регистрация: Dec 2014
Сообщений: 312
|
С помощью метатегов event мы можем указать редактору кода, какие события может отправлять Man.
А как узнать какой объект придет в слушатель, не залезая в Man? |
|
|||||
|
Цитата:
Если есть Man и ManEvent, то не должен Man отправлять никаких TransportEvent. Он должен слать ManEvent, чтобы все было интуитивно понятно. |
|
|||||
|
Цитата:
Зачем нужно посылать TransportEvent, пытаясь его выдать за ManEvent, когда можно просто сделать свойство в TransportEvent публичным, и оно будет доступно как в ManEvent, так и в TransportEvent и в других местах, где есть доступ к объекту ManEvent или TransportEvent. Что мешает сделать так? package { import flash.events.Event; /** * ... * @author Konstantin */ public class TransportEvent extends Event { public var dog:Object = null; public function TransportEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } public override function clone():Event { var event:TransportEvent = new TransportEvent(type, bubbles, cancelable); event.dog = this.dog; return event; } public override function toString():String { return formatToString("TransportEvent", "type", "bubbles", "cancelable", "eventPhase"); } } } package { import flash.events.Event; /** * ... * @author Konstantin */ public class ManEvent extends TransportEvent { public static const DOG_BUY:String = "dogBuy"; public function ManEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } public override function clone():Event { var event:ManEvent = new ManEvent(type, bubbles, cancelable); event.dog = this.dog; return event; } public override function toString():String { return formatToString("ManEvent", "type", "bubbles", "cancelable", "eventPhase"); } } } // а где-то в классе Man var event:ManEvent = new ManEvent(ManEvent.DOG_BUY); event.dog = какаяТоСобака; dispatchEvent(event); // и, соответственно, слушать надо будет ManEvent.DOG_BUY |
|
|||||
|
Регистрация: Dec 2014
Сообщений: 312
|
Пусть будет публичное. Это никак не влияет на суть вопроса.
Зачем у вас класс ManEvent расширяет TransportEvent? Что он умеет нового по сравнению с TransportEvent? |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:39. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|