Есть ли способ получить доступ к производному типу класса для абстрактного - PullRequest
0 голосов
/ 31 января 2019

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

public abstract class EventData<T> where T : EventData<T>
{
    Action<T> action_;
    public void Subscribe(Action<T> _actor) { action_ += _actor; }
    public void Unsubscribe(Action<T> _actor) { action_ -= _actor; }
    public void Dispatch(T _data) { if (action_ != null) action_(_data); }
}

public class ConcreteEventData : EventData<ConcreteEventData>
{
    int arg1;
    string arg2;
}

Итак, я вынужден использовать эту неудобную конструкцию ConcreteEventData : EventData<ConcreteEventData> вместопростой и короткий ConcreteEventData : EventData, даже если я буду помнить, что я использовал бы тот же тип, который я описал.Более того, если кто-то будет использовать этот базовый класс, он может написать что-то вроде:

public class AnotherConcreteEventData : EventData<ConcreteEventData>
{
    float arg1;
    bool arg2;
}

Как видите, это не очень хороший способ использовать эту идею, есть ли другой, чтобы использовать его более элегантно

1 Ответ

0 голосов
/ 31 января 2019

Хорошо, решение было довольно простым.Вместо того, чтобы создавать класс для моего «события», я мог бы просто использовать EventArgs в качестве класса данных без какого-либо события.Моей целью было использовать его для EventBus, поэтому вместо того, чтобы делать что-то вроде

public abstract class EventData<T> where T : EventData<T>
    {
        Action<T> action_;
        public void Subscribe(Action<T> _actor) { action_ += _actor; }
        public void Unsubscribe(Action<T> _actor) { action_ -= _actor; }
        public void Dispatch(T _data) { if (action_ != null) action_(_data); }
    }
    public class EventBus
    {
        static Dictionary<string, EventData> _dict;
    }

(более того, я не могу этого сделать, и меня тоже могут найти решение этой проблемы), я могу простоиспользуйте

public class EventBus<T> where T : EventArgs
    {
        static Dictionary<string, Action<T>> list;

        public static void SubscribeOnEvent(string _sid, Action<T> _method)
        {
            // Do Stuff...
        }
    }

и используйте его так, как

EventBus<MyData>.Subscibe("myID", (data) => { /*Do stuff...*/ });

И теперь я могу использовать все данные, полученные из EventArgs.Спасибо @JeroenMostert за идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...