有什么方法可以访问抽象类的派生类类型

时间:2019-01-31 15:49:46

标签: c# oop inheritance

我想创建一个包含一些信息的数据类,并提供一个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 :(得分:0)

好的,解决方案很简单。不用为我的“事件”创建类,我可以简单地将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的想法。