首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#泛型抽象类继承传递不同泛型参数的泛型抽象类

C#泛型抽象类继承传递不同泛型参数的泛型抽象类
EN

Stack Overflow用户
提问于 2022-05-03 08:28:54
回答 2查看 99关注 0票数 -1

这是我的问题。我有这样的通用Singleton类:

代码语言:javascript
复制
public abstract class Singleton<T> where T : Singleton<T>, new()
{
    private static T instance;
    public static T Instance
    {
        get
        {
            return instance == null ? new T() : instance;
        }
    }
}

我想要创建一个ProcessManager,它也是一个泛型抽象类,但是具有从这个Singleton类继承的枚举泛型参数。这是我目前编写的代码,但有错误:

代码语言:javascript
复制
    public abstract class ProcessManager<TEnum> : Singleton<ProcessManager<TEnum>> where TEnum : Enum, new()
    {
        private TEnum state;
        private Dictionary<TEnum, Action> stateInitializations = new Dictionary<TEnum, Action>();

        public TEnum State
        {
            get { return state; }
            set { InitializeState(state); }
        }

        private void InitializeState(TEnum _state)
        {
            stateInitializations[_state].Invoke();
        }
    }

在'class ProcessManager‘处有一个红色的下划线,带有错误CS0310

ProcessManager<TEnum>必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法Singleton<T>中的参数“参数”。

有人能告诉我怎么解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-04 06:31:52

因为T是一个递归约束,所以必须强制任何扩展ProcessManager的类型将它们的具体类型映射到T上;

代码语言:javascript
复制
abstract class ProcessManager<T, E> : Singleton<T>
    where T : ProcessManager<T, E>, new()
    where E : Enum { ... }

class ConcreteType : ProcessManager<ConcreteType, EnumType> { ... }
票数 0
EN

Stack Overflow用户

发布于 2022-05-04 06:24:44

我试着用两种方法来解决这个问题:

删除ProcessManager's 'abstract'.

  • Remove Singleton‘s,new ()和new T.

但是第二个没有道理,所以我最终决定用第一个。

总之,非常感谢那些离开评论的好人,他们真诚地帮助了我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72096680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档