此抽象类是否有另一种方法可以从此泛型类型派生?错误CS0310

时间:2019-12-02 22:37:20

标签: c# generics

我有以下几段代码:

// The Singleton.cs file.
public abstract class Singleton<T> where T : class, new()
{
    private static T _instance;

    public static T Instance => _instance ?? (_instance = new T());
}
// The ScriptEvent.cs file.
public abstract class ScriptEvent : Singleton<ScriptEvent>
{
    public abstract void RaiseEvent(params object[] raiseParameters);

    public abstract void Subscribe(Delegate toSubscribe);

    public abstract void Unsubscribe(Delegate toUnsubscribe);

    public abstract Delegate[] GetSubscribers();
}

我希望ScriptEvent可以从Singleton派生,因为ScriptEvent必须是一个Singleton。但是,这给了我这个错误:

Error   CS0310  'ScriptEvent' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'Singleton<T>

到目前为止,我唯一能看到的解决方案是直接在ScriptEvent中直接实现Singleton功能,尽管这可行,但对我来说确实很不干净/不必要。

有没有办法可以解决这个问题?我宁愿将ScriptEvent保持为Abstract,尽管在撰写本文时,我意识到我也可以抽象化它,而改用虚拟方法。但是,这可能会使该代码的未来用户感到困惑,因为他们可能会尝试实例化一个ScriptEvent,这不是故意的(因此,单例化:P和抽象)。我还认为另一种解决方案是使ScriptEvent通用,并让派生类提供其自己的类型,类似于Singleton的工作方式,但我认为这种方法不太理想,因为我希望避免对派生器造成尽可能多的混淆。

编辑:我找到了(临时的)解决方案。 我使用“抽象”方法。我使该类成为常规类,用几乎完全相同的虚拟方法替换了所有抽象方法,但添加了一个空的静态构造函数以防止实例化! 但是,我仍然想得到一个答案,因为我对这种解决方案不太满意。

1 个答案:

答案 0 :(得分:1)

删除继承。请改用类型约束。

// The Singleton.cs file.
public abstract class Singleton<T> where T : ScriptEvent, new() //Type constraint
{
    private static T _instance;

    public static T Instance => _instance ?? (_instance = new T());
}

// The ScriptEvent.cs file.
public abstract class ScriptEvent  //No inheritance
{
    public abstract void RaiseEvent(params object[] raiseParameters);

    public abstract void Subscribe(Delegate toSubscribe);

    public abstract void Unsubscribe(Delegate toUnsubscribe);

    public abstract Delegate[] GetSubscribers();
}

然后获取您要使用的实例:

var instance = Singleton<DerivedType>.Instance;