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