C# 有没有办法根据初始枚举值使用不同的构造函数?

C# 有没有办法根据初始枚举值使用不同的构造函数?,c#,enums,constructor,C#,Enums,Constructor,我目前正在用c#开发一款类似地牢爬行器的游戏,但目前在类的构造函数方面遇到了麻烦。我想知道是否可以根据初始枚举值使用不同的构造函数?在本例中,它只有两个可能的值,因此一个简单的布尔值就足够了,但是如果我有两个以上的值,我很好奇您是否可以根据输入的初始枚举值执行不同的构造函数?抱歉,如果我的格式错误或我不是很具体,这是我第一次在这里提交问题:)) 以下是我当前的枚举以供参考: public enum Type { Passive, Action } public enum Tri

我目前正在用c#开发一款类似地牢爬行器的游戏,但目前在类的构造函数方面遇到了麻烦。我想知道是否可以根据初始枚举值使用不同的构造函数?在本例中,它只有两个可能的值,因此一个简单的布尔值就足够了,但是如果我有两个以上的值,我很好奇您是否可以根据输入的初始枚举值执行不同的构造函数?抱歉,如果我的格式错误或我不是很具体,这是我第一次在这里提交问题:))

以下是我当前的枚举以供参考:

public enum Type
{
    Passive,
    Action
}

public enum Trigger
{
    PlayerTakeDamage,
    EnemyTakeDamage,
    Draw,
    PlayerDebuff,
    EnemyDebuff,
    PlayCard
}
以下是我想要实现的目标:

public class Action
{
    public int Energy {get; private set;}
    public int Damage {get; private set;}

    public Action(Type.Passive, Trigger trigger, int damage, int energy)
    {
        do thing;
    }
    public Action(Type.Action, int damage, int energy)
    {
        do other thing;
    }
}
再次,如果这是一个愚蠢的问题,或者如果我弄乱了这里的格式,我深表歉意,但我真诚地感谢任何人提供的任何建议:)


编辑:很抱歉,我对潜在的应用不是很具体。我想基于初始枚举值重载构造函数,因为我想在构造之后完成不同的附加参数。我已经添加了说明以帮助:)。

我们可以使用不同签名的构造函数重载。构造函数重载是通过参数的数量、不同类型的参数而不是值来完成的。我已经通过使用条件简化了您的代码,希望这能有所帮助

public class Action
{
    public Action(Type t)
    {  
        if(t == Type.Passive)
        { 
            //do thing; 
        }
        else if(t== Type.Action)
        { 
            //do another thing; 
        }
    }
}

在概念上,像这样的东西可能就是你想要的

public class Person
{
    private int _Speed;
    private double _ReactionTime;
    private int _CalorieConsumptionPerHour;

    public Person(Stance stance) 
    {
        if (stance == Stance.Active)
            setToActive();
        else if (stance == Stance.Passive)
            setToPassive();
        else
            setToDefault();
    }

    private void setToActive()
    {
        _Speed = 30;
        _ReactionTime = .15;
        _CalorieConsumptionPerHour = 200;
    }

    private void setToPassive()
    {
        _Speed = 10;
        _ReactionTime = .5;
        _CalorieConsumptionPerHour = 100;
    }

    private void setToDefault()
    {
        _Speed = 20;
        _ReactionTime = .3;
        _CalorieConsumptionPerHour = 150;
    }

    public enum Stance
    {
        Active,
        Passive
    }
}

正如两个答案所提到的,您可以将枚举传递给构造函数,并基于所述枚举创建一个新对象

我会采取完全不同的方法。听说过IoC(控制反转)吗

控制反转(IoC)和依赖项注入(DI)模式都是关于从代码中删除依赖项

这对你来说意味着什么

让我们假设存在不同类型的操作,它们都遵循相同的规则(相同的方法)

这在OOP语言中发出了
接口

public Interface IAction {
    void DoSomething();
    int DoSomethingElse();
}
现在,所有动作都有一些标准动作,而其他动作则有所不同

public abstract AbstractAction: IAction {
    public int Energy {get; private set;}
    public int Damage {get; private set;}
}
现在为每个动作创建不同的类

public class PlayerTakeDamageAction: AbstractAction {

    public PlayerTakeDamageAction(/*some parameters*/) {
    }

    // Override the behavior per class
}
这一切跟你有什么关系?现在,您可以使用依赖项注入或FactoryPattern应用
IoC
。这意味着您将
IAction
对象的创建委托给其他人

下面是一个抽象工厂的简单示例

public class ActionConsumer {
    private IActionFactory factory;

    public A(IActionFactory factory) {
        this.factory = factory;
    }

    public void DoSomething() {
        IAction a = factory.MakeAction(Trigger.PlayerTakeDamageAction);
        a.DoSomething();
    }
}

public ConcreteActionFactory: IActionFactory {
    IAction MakeAction() {
        return new PlayerTakeDamageAction();
    }

    IAction MakeAction(Trigger trigger) {
        if (Trigger == Trigger.PlayerTakeDamageAction)
           return new PlayerTakeDamageAction();
        else if // you get the idea
    }
}

interface IActionFactory {
    // Creates some default action
    IAction MakeAction();
    // Creates some specific action
    // You can pass any parameters or create multiple action
    // generators, depending on what the new object needs.
    IAction MakeAction(Trigger trigger);
}

@IanWatkins这是否有帮助?虽然这是我的初始解决方案,但我不确定如何利用它在基于枚举值的构造函数中具有不同的参数`我想基于初始枚举值重载构造函数,因为我想在这之后完成不同的附加参数,这将是需要的构造“无法理解这一点您不能重载同一枚举类型的不同值。有没有理由不让一个构造函数根据值进行内部委托?Aluan Haddad,我想让构造函数根据枚举值采用不同的参数我很抱歉,整个IOC概念对我来说都是新概念,因为我对OOP一般来说都很陌生,但这似乎非常有帮助!非常感谢!:)