Как добавить абстрактный класс с generi c в качестве аргумента делегата в c# - PullRequest
1 голос
/ 28 апреля 2020

У меня есть абстрактный класс с именем StatesHandler с обобщенным c типом T. В этом классе у меня есть делегат, который вызывается из класса:

public abstract class StatesHandler<T>
{
    public event Action<StatesHandler<T>> OnStatesChanged;

    private void Function(){
        OnStatesChanged(this);
    }
}

У меня есть реализация этого абстрактного класса, где State - это перечисление:

public class MyStatesHandler : StatesHandler<State>{}

В третьем классе я добавляю слушателя к этому делегату:

public class MyThirdClass
{
    private MyStatesHandler myStatesHandler;

    private void AddListener()
    {
        myStatesHandler.OnStatesChanged += StateChanged;
    }

    private void StateChanged(StatesHandler<State> statesHandler)
    {
    }
}

Мой вопрос заключается в том, почему добавляемая к слушателю функция должна иметь подпись StatesHandler<State>, а не просто MyStatesHandler?

Не должны ли оба работать?

1 Ответ

2 голосов
/ 28 апреля 2020

OnStatesChanged принимает в качестве параметра StatesHandler<T> или что-нибудь, полученное из StatesHandler<T>.

Предположим, поэтому у нас также было

public class SomeOtherHandler : StatesHandler<State>{}

Можно было бы вызвать OnStatesChanged передача объекта этого класса в качестве параметра, поскольку он является производным от StatesHandler<T>. Однако это не может быть передано

private void StateChanged(MyStatesHandler statesHandler)
{
}

, поскольку между MyStatesHandler и SomeOtherHandler нет отношения наследования.

Таким образом, обработчик событий должен принимать параметр базового класса.

...