Java→创建抽象类的匿名实例

本文关键字:实例 抽象类 创建 Java | 更新日期: 2023-09-27 18:15:50

出于培训目的,我正在遵循为Java编写的教程,到目前为止,我成功地将其"翻译"成c#,然而,我现在面临的问题是我真的不知道如何解决它。对于我的问题,我能找到的最接近的答案是这个问题。虽然我现在在理解委托和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,但我想保持平滑与原始

Java→创建抽象类的匿名实例

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);