Как реализовать абстрактное событие или событие метода интерфейса в C #? - PullRequest
1 голос
/ 23 июля 2010

Мой базовый интерфейс IFoo объявляет

event EventHandler Changed

когда я «внедряю интерфейс», я получаю некоторый шаблонный код, но как мне обеспечить достойную реализацию по умолчанию?

add { throw new NotImplementedException(); }
remove { throw new NotImplementedException(); }

Ответы [ 3 ]

4 голосов
/ 23 июля 2010

Как интерфейс объявляет событие с префиксом имени интерфейса в имени события?Я не уверен, что это законно C #.

Если вы можете уйти без "IFoo".префикс, просто объявите событие в вашем классе и позвольте компилятору создать обработчики добавления / удаления по умолчанию для вас.Все, о чем вам следует беспокоиться, это когда вызвать событие:

interface IFoo
{
    event EventHandler OnChanged;
}

class MyClass : IFoo
{
    public event EventHandler OnChanged;

    private FireOnChanged()
    {
        EventHandler handler = this.OnChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty); // with appropriate args, of course...
        }
    }
}

... Или я неправильно понял, откуда вы наследуете событие?Ваш класс является производным от абстрактного базового класса, который, в свою очередь, реализует интерфейс (который объявляет событие)?Это может быть то, что вы имеете в виду, но это не было ясно в вопросе.

2 голосов
/ 23 июля 2010
private EventHandler onChanged;

event EventHandler IFoo.OnChanged
{
    add
    {
        onChanged += value;
    }
    remove
    {
        onChanged -= value;
    }
}
0 голосов
/ 23 июля 2010

Я рекомендую изменить название мероприятия, чтобы оно соответствовало общепринятым стандартам именования событий.В этом случае изменилось. Ссылка на предыдущий пост

   private System.EventHandler _Changed;

    private readonly object _EventLock = new object();

    public event System.EventHandler Changed {
        add {
            lock (_EventLock) {
                _Changed += value;
            }
        }
        remove {
            lock (_EventLock) {
                _Changed -= value;
            }
        }
    }

    protected virtual void OnChanged(System.EventArgs args) {

        System.EventHandler handler = _Changed;
        if (handler != null) {
            handler(this, args);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...