C#-如何将枚举指定为必须在抽象类中实现?

C#-如何将枚举指定为必须在抽象类中实现?,c#,enums,factory,C#,Enums,Factory,例如,我有一个factory类: abstract class UnitFactory<T> where T:Unit { abstract enum UnitType; public abstract T GetUnit(UnitType type); } 您应该为抽象工厂定义两种泛型类型 public abstract class UnitFactory<TType, TUnit> where TUnit:Unit { public abstr

例如,我有一个factory类:

abstract class UnitFactory<T> where T:Unit
{
   abstract enum UnitType;

   public abstract T GetUnit(UnitType type);
}

您应该为抽象工厂定义两种泛型类型

public abstract class UnitFactory<TType, TUnit> where TUnit:Unit
{
    public abstract TUnit GetUnit(TType type);
}
最终创建了阿彻工厂

public class ArcherFactory : UnitFactory<ArcherType, Archer>
{
    private static Archer _baseLongbowman = ....;
    private static Archer _baseCrossbowman = ....;

    public override Archer GetUnit(ArcherType type)
    {
        switch (type)
        {
            case ArcherType.Crossbowman:
                return  _baseCrossbowman.Clone(...);

            default:
                return  _baseLongbowman.Clone(...);

        }
    }
}

要求每个具体工厂公开自己的类型列表意味着所有具体实现都将单独绑定到该工厂

换句话说,做以下事情绝对没有好处:

var longbowman = archerFactory.GetUnit(ArcherFactory.UnitType.Longbowman);
var crossbowman = archerFactory.GetUnit(ArcherFactory.UnitType.Crossbowman);
与简单的:

// this is better than a huge switch/case method
var longbowman = archerFactory.GetLongbowman()
var crossbowman  = archerFactory.GetCrossbowman();
为了使抽象工厂模式有意义,您需要将类型与工厂分开定义,即

enum ArcherType { Longbowman, Crossbowman }

interface IFactory<Ttype, Tvalue>
{
    Tvalue GetUnit(Ttype);
}

interface IArcherFactory : IFactory<ArcherType, Archer>
{
    ...
}
enum弓箭手类型{Longbowman,Crossbowman}
接口工厂
{
t值获取单位(Ttype);
}
接口工厂:IFactory
{
...
}

抽象枚举是什么意思?枚举不支持继承。它们只是valuesNum是一种值类型,不幸的是,你们不能从中派生出任何东西。这听起来像是一个例子。对X有问题,假设Y是解决方案(抽象枚举),当这不起作用时,询问Y,而不是实际的问题X。实际的问题是什么?我明白,我只想有一个类似“抽象枚举”的东西,一个必须实现的枚举。@Tr1et:什么是“已实现枚举”?提供一个示例,说明如何1)实例化多个具体工厂,2)调用
GetUnit
以获得多个工厂/单元类型的组合。太棒了!!!!我真的没有考虑将枚举作为类型参数传递。但我可以将第一个类型参数限制为enum吗?尽管您可以只使用一个UnitType enum,并使用不同的枚举值将不同的构造函数委托注册到一个工厂中。。。所以可以使用UnitFactory.Create(UnitType.LongBowman)。也不需要克隆等。添加了在工厂内注册FUNC的示例,这将使您的生活更轻松,而无需担心克隆。
var archerFactory = new ArcherFactory();
var crossbowMan = archerFactory.GetUnit(ArcherType.Crossbowman); 
var longbowman = archerFactory.GetUnit(ArcherFactory.UnitType.Longbowman);
var crossbowman = archerFactory.GetUnit(ArcherFactory.UnitType.Crossbowman);
// this is better than a huge switch/case method
var longbowman = archerFactory.GetLongbowman()
var crossbowman  = archerFactory.GetCrossbowman();
enum ArcherType { Longbowman, Crossbowman }

interface IFactory<Ttype, Tvalue>
{
    Tvalue GetUnit(Ttype);
}

interface IArcherFactory : IFactory<ArcherType, Archer>
{
    ...
}