У меня есть маленькое шахматное приложение, которое состоит из ячеек и плат. Когда пользователь перемещает объект в плату, я хочу, чтобы ячейка платы диспетчеризировала событие, таким образом, Совет может слушать его и позвонить слушателю
public class BoardCell extends Canvas
{
public function Sample():void
{
....Some code
var e:Event = new Event("newMove")
dispatchEvent(e);
}
}
Однако я не могу поймать событие в родительском классе шахматной доски (Не уверенный, что я прислушиваюсь к нему правильно),
public class FrontEndBoard extends ChessBoard
{
private var initialPoition:String;
public function FrontEndBoard()
{
//TODO: implement function
this.addEventListener(Event.ADDED_TO_STAGE, addedToStage);
this.addEventListener("newMove", moveEvent);
super();
}
у вас есть 2 варианта:
1) вместо this.addEventListener ("newMove", moveEvent); do BoardCell.addEventListener ("newMove", moveEvent);
2) иметь блок событий до родительского (предполагая, что BoardCell является отображаемым дочерним элементом FrontEndBoard, вы устанавливаете его как параметр в конструкторе событий)
var e: Событие = новое событие ("newMove", истина).
Событие, которое вы отправляете из класса BoardCell, должно всплыть, чтобы оно было перехвачено в любых родительских классах. Проверьте аргументы конструктора класса Event, где вы можете установить для флага «пузырьки» значение true.
Это может быть связано с тем, что вы не располагаете своим WebResponse или StreamReaders:
var request = WebRequest.Create(...);
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var reader = new StreamReader(responseStream))
{
// use the reader
}
}
}
-121--3147264- Вы можете делать именно то, что вы пытаетесь. Отсутствует только пользовательский конструктор, вызывающий конструктор по умолчанию:
struct Animal
{
public string name = "";
public static int weight = 20;
public Animal(bool someArg) : this() { }
}
Конструктор должен взять хотя бы один параметр, а затем переслать на this ()
для инициализации членов.
Причина, по которой это работает, заключается в том, что компилятор теперь имеет возможность обнаружить время, когда код должен выполняться для инициализации поля name
: всякий раз, когда вы пишете new Animal (someBool)
.
С любой структурой вы можете сказать new Animal ()
, но «пустые» животные могут быть созданы неявно во многих обстоятельствах в работе CLR, и нет способа гарантировать, что пользовательский код будет выполняться каждый раз, когда это произойдет.
Я не уверен, насколько точно в вашем приложении иерархически находятся FureEndBoard и BoardCell, но вам может потребоваться сообщить событию «newMove», что оно может пузырь .
var e:Event = new Event("newMove", true);