Как виртуальные события работают в C#?

Cypress найдет сетевой запрос только после того, как будет псевдонимом. Код в вашем вопросе указал, что вы не выполняете действие, которое вызовет сетевой запрос:

        cy.route('GET',
            '**/getIncentives*',
            {info: {}, results: {}}
        ).as('oppty');

       // cypress expected something to cause a network request here

        cy.wait('@oppty');

Вы должны либо переместить вызов на route ранее в тесте, либо переместить код, вызывающий запрос после звонка в route.

9
задан Prankster 3 April 2009 в 17:26
поделиться

3 ответа

У нас есть единственный экземпляр (B), который имеет следующие поля:

  • A.VirtualEvent: пустой указатель
  • B.VirtualEvent: Два обработчика событий

Вызов к a.RaiseA() просто печать "Повышает" - но ничто больше, потому что частное поле в A является пустым.

Вызов к b.RaiseB() печатает оставление тремя строками, потому что событие было подписано на дважды (однажды для печати "События от" и однажды распечатать "Событие от B").

Это помогает?

Править: Для создания этого более ясным - думают о виртуальном событии как о паре виртуальных методов. Это очень похоже на это:

public class A
{
    private EventHandler handlerA;

    public virtual void AddEventHandler(EventHandler handler)
    {
        handlerA += handler;
    }

    public virtual void RemoveEventHandler(EventHandler handler)
    {
        handlerA -= handler;
    }

    // RaiseA stuff
}

public class B : A
{
    private EventHandler handlerB;

    public override void AddEventHandler(EventHandler handler)
    {
        handlerB += handler;
    }

    public override void RemoveEventHandler(EventHandler handler)
    {
        handlerB -= handler;
    }

    // RaiseB stuff
}

Теперь действительно ли это более ясно? Это не совсем похоже на это, потому что насколько я знаю, что Вы не можете переопределить просто "часть" события (т.е. один из методов), но это производит правильное общее впечатление.

12
ответ дан 4 December 2019 в 14:31
поделиться

Попытайтесь делать свою функцию RaiseA защищенной + виртуальный.

Эмпирическое правило: Если производный класс переопределяет средства доступа события, он должен также переопределить функцию, которая вызывает событие.

0
ответ дан 4 December 2019 в 14:31
поделиться

Вы подняли трубку два обработчика событий к тому же событию. Так как A и B указывают на тот же объект при вызове b. RaiseB () оба обработчика событий запущен. Таким образом, сначала Вы называете RaiseA, который является методом базового класса. Это печатает Повышение A. Это затем на самом деле не исчерпывает событие, потому что это является пустым. Затем Вы повышаете B, но ДВА обработчика сцепляются до него, поэтому он сначала печатает Повышение B, и когда событие стреляет, оба обработчика называют.

2
ответ дан 4 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: