Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java->;C#创建抽象类的匿名实例_Java_C#_Lambda_Delegates_Abstract Class - Fatal编程技术网

Java->;C#创建抽象类的匿名实例

Java->;C#创建抽象类的匿名实例,java,c#,lambda,delegates,abstract-class,Java,C#,Lambda,Delegates,Abstract Class,出于培训的目的,我正在学习一本为Java编写的教程,到目前为止,我已经成功地将其“翻译”成了C语言。然而,我现在面临的一个问题是,我真的不知道如何解决它。对于我的问题,我能找到的最接近(?)的答案是,尽管目前我在理解委托和lamba表达式方面有困难。无论如何,下面是Java中的相关代码: public abstract class LevelUpOption { private String name; public String name() { return name; } p

出于培训的目的,我正在学习一本为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;
    }
}

虽然很容易理解它在做什么,但我不知道如何用C#写那个相对类似的东西。我可以用非常简单的方法来解决这个问题,比如if或switch cases,但我想让它保持原样。

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;
}
由于
invoke
是一个委托,因此调用它的语法相同:

options[i].invoke(myCreature);

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;
}
由于
invoke
是一个委托,因此调用它的语法相同:

options[i].invoke(myCreature);

在这里,委托是最明智的方法——要么单独使用,要么作为单独类的一部分(如果您确实需要描述部分)。你说你在理解代理时“有问题”——但你没有给出任何细节,所以很难帮助你更好地理解它们……我有点理解它们,至少在理论上,多播也是如此,我只是觉得在实践中使用它们很不确定,因为我没有使用它们的经验。在这里,委托是最明智的方法——无论是单独使用,还是作为单独类的一部分,如果您确实需要描述部分。你说你在理解委托时“有问题”-但你没有给出任何细节,因此很难帮助你更好地理解它们…我有点理解它们,至少在理论上,也理解多播,我只是觉得在实践中使用它们非常不确定,因为我没有使用它们的经验。我想我应该在类上放置一个方法来调用委托,与其把它公开为一个公共领域……那太完美了,谢谢你。虽然我不太理解中的“c=>c.gainMaxHp()”部分,但为什么“允许”它在那里工作?但这更多的是因为我一开始还不理解=>。@user3800990
=>
是构造lambda的一种方法。C#中委托的Lambda与Java中基类的匿名类大致相同。不同之处在于,在Java中,匿名类可以实现任意多个方法,而lambda只能“实现”一个与其委托签名匹配的方法。我想我应该在类上放置一个方法来调用委托,而不是将其公开为公共字段……这非常好,非常感谢。虽然我不太理解中的“c=>c.gainMaxHp()”部分,但为什么“允许”它在那里工作?但这更多的是因为我一开始还不理解=>。@user3800990
=>
是构造lambda的一种方法。C#中委托的Lambda与Java中基类的匿名类大致相同。不同之处在于,在Java中,匿名类可以实现任意多个方法,而lambda只能“实现”一个与其委托签名匹配的方法。