C#: Что такое виртуальные события и как они могут использоваться?

Изменено в документации SweetAlert здесь:

https://sweetalert.js.org/guides/#using-dom-nodes-as-content

swal("Please enter a name for the template.", {
  content: "input",
})
.then((response) => {
  document.getElementById('HiddenFieldCurrentTemplate').value = response;
});

21
задан Community 23 May 2017 в 12:24
поделиться

2 ответа

Виртуальное событие - это просто событие, которое может быть переопределено в производном классе.

Довольны ли вы концепция виртуального свойства, с геттером и сеттером, которые можно переопределить? Если это так, вы можете думать о виртуальном событии точно так же: вместо получателя и сеттера есть операция «добавить» и операция «удалить». Они могут быть виртуальными, поэтому обрабатываются полиморфно. Вы реализуете их так же, как и любой другой виртуальный / переопределенный член.

Пример:

using System;

class Base
{
    public virtual event EventHandler Foo
    {
        add
        {
            Console.WriteLine("Base Foo.add called");
        }
        remove
        {
            Console.WriteLine("Base Foo.remove called");
        }
    }
}

class Derived : Base
{
    public override event EventHandler Foo
    {
        add
        {
            Console.WriteLine("Derived Foo.add called");
        }
        remove
        {
            Console.WriteLine("Derived Foo.remove called");
        }
    }
}

class Test
{
    static void Main()
    {
        Base x = new Derived();

        x.Foo += (sender, args) => {};
    }
}

Обратите внимание, что само событие не отвечает за то, что происходит при его возникновении - только сторона добавления / удаления. (Во всяком случае, в C #; сама среда CLR имеет понятие повышения, но мы пока проигнорируем это.)

Вы также можете прочитать мою статью о событиях , если вы немного нечетко о разнице между событием и делегатом.

Лично я нахожу очень редкостью, что мне нужно виртуальное событие.

28
ответ дан 29 November 2019 в 21:32
поделиться

Чтобы Foo был повышен существует 2 альтернативы, которые я нахожу пропавшими без вести из принятого ответа.

public class Base 
{
    public virtual event EventHandler Foo;

    public void Bar()
    {
        RaiseFoo();
    }

    protected virtual void RaiseFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty);
    }
}

public class Derived : Base
{
    // In this case we use the base Foo as a backing store.
    public override event EventHandler Foo
    {
        add { base.Foo += value; }
        remove { base.Foo -= value; }
    }
}

public class Derived2 : Base
{
    public override event EventHandler Foo;

    // In this case we raise the overriden Foo.
    protected override void RaiseFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty);
    }
}

class Test
{
    static void Main()
    {
        Base x = new Derived();
        x.Foo += (sender, e) => { };
        x.Bar();
        Base x2 = new Derived2();
        x2.Foo += (sender, e) => { };
        x2.Bar();
    }
}

Примечание, что это не работает:

public class Derived3 : Base
{
    public override event EventHandler Foo
    {
        add { base.Foo += value; }
        remove { base.Foo -= value; }
    }

    protected override void RaiseFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty);
    }
}
0
ответ дан 29 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

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