出于培训目的我正在遵循为Java编写的教程,到目前为止,我成功地将其“翻译”为C#,但是,我现在面临一个问题,我真的不知道如何解决它。我能找到的最接近(?)问题的答案是this question.虽然我现在理解委托和lamba表达式时遇到了问题。无论如何,这里是Java中的相关代码:
public abstract class LevelUpOption {
private String name;
public String name() { return name; }
public LevelUpOption(String name){
this.name = name;
}
public abstract void invoke(Creature creature);
}
另一堂课:
public class LevelUpController {
private static LevelUpOption[] options = new LevelUpOption[]{
new LevelUpOption("Increased hit points"){
public void invoke(Creature creature) { creature.gainMaxHp(); }
},
new LevelUpOption("Increased attack value"){
public void invoke(Creature creature) { creature.gainAttackValue(); }
},
new LevelUpOption("Increased defense value"){
public void invoke(Creature creature) { creature.gainDefenseValue(); }
},
new LevelUpOption("Increased vision"){
public void invoke(Creature creature) { creature.gainVision(); }
}
};
public void autoLevelUp(Creature creature){
options[(int)(Math.random() * options.length)].invoke(creature);
}
public List<String> getLevelUpOptions(){
List<String> names = new ArrayList<String>();
for (LevelUpOption option : options){
names.add(option.name());
}
return names;
}
public LevelUpOption getLevelUpOption(String name){
for (LevelUpOption option : options){
if (option.name().equals(name))
return option;
}
return null;
}
}
我遇到的问题是这部分:
private static LevelUpOption[] options = new LevelUpOption[]{
new LevelUpOption("Increased hit points"){
public void invoke(Creature creature) { creature.gainMaxHp(); }
},
new LevelUpOption("Increased attack value"){
public void invoke(Creature creature) { creature.gainAttackValue(); }
},
new LevelUpOption("Increased defense value"){
public void invoke(Creature creature) { creature.gainDefenseValue(); }
},
new LevelUpOption("Increased vision"){
public void invoke(Creature creature) { creature.gainVision(); }
}
};
虽然易于理解它正在做什么,但我不知道如何在C#中编写相对类似的东西。我可以用非常简单的方式解决它,比如使用if或switch case,但是我想将它保持在原来的 smooth 。
答案 0 :(得分:4)
C#中没有匿名类,但您有两种方法可以实现相同的结果:
第一种方法是不言自明的,但代码会更长。命名的类应该没问题,因为它们对于公开可见类的实现是私有的。
第二种方法可能如下:
public class LevelUpOption {
private String name;
public String name() { return name; }
public LevelUpOption(String name, Action<Creature> invoke){
this.name = name;
this.invoke = invoke;
}
public readonly Action<Creature> invoke;
}
现在您可以像这样初始化数组:
private static LevelUpOption[] options = new [] {
new LevelUpOption("Increased hit points", c => c.gainMaxHp() ),
new LevelUpOption("Increased attack value", c => c.gainAttackValue()),
...
};
由于invoke
是委托,因此调用它的语法是相同的:
options[i].invoke(myCreature);