这个抽象类有没有另一种方法可以从这个泛型类型派生?错误 CS0310



我有这些代码片段:

// 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 必须是单例。但是,这给了我这个错误:

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>

到目前为止,我能看到的唯一解决方案是直接将 Singleton 功能直接实现到 ScriptEvent 中,虽然这可以工作,但对我来说确实感觉很不干净/不必要。

有没有办法解决这个问题?我更愿意将 ScriptEvent 保留为抽象,尽管在我写这篇文章时,我已经意识到我也可以去抽象它并使用虚拟方法。但是,这可能会使此代码的未来用户感到困惑,因为他们可能会尝试实例化 ScriptEvent,而这不是预期的(因此单调化:P和抽象(。我还假设另一种解决方案是使 ScriptEvent 泛型,并让派生类提供自己的类型,类似于 Singleton 的工作方式,但我认为这是非常不理想的,因为我宁愿尽可能避免对 deriver 的混淆。

编辑:我找到了我的问题的(临时?(解决方案。 我使用"去抽象"方法。我把这个类变成了一个常规类,用几乎相同的虚拟方法替换了所有抽象方法,但添加了一个空的静态构造函数来防止实例化! 但是,我仍然想要答案,因为我对这个解决方案不太满意。

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

// 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;

最新更新