【问题标题】:Passing class as an argument to method and then using it to create new class item将类作为参数传递给方法,然后使用它来创建新的类项
【发布时间】:2016-03-30 05:27:50
【问题描述】:

所以我正在尝试制作通用战斗代码,为此我需要将敌人类传递给我的战斗虚空。现在它看起来像这样:

static void Combat()
{
Character.Player player = new Character.Player();
Character.Gnome gnome = new Character.Gnome();
}

带字符的类如下所示:

class Character
{
//hp, damage and other universal stuff
}

class Player : Character
{
//hp, damage and stuff
}

class Enemy : Character
{
}

class Gnome : Enemy
{
//stuff
}

class Skeleton : Enemy
{
//stuff
}

因此,目前,void Combat() 不是通用代码,因为您只能与 gnome 战斗。我希望能够进行战斗(骷髅)或战斗(侏儒)来对抗这个特定的对手。我试过这样做

void Combat(Character.Enemy enemyType)
{
Character.enemyType enemy = new Character.enemyType();
}

但它不起作用。有什么想法吗?

【问题讨论】:

  • Combat 方法如何使用Character.Gnome 对象或任何其他字符?

标签: c# class parameter-passing void


【解决方案1】:

您可以将generics 与新的constraint 一起使用,如下所示:

void Combat<tEnemy>() where tEnemy : Character.Enemy, new()
{
    Character.Player player = new Character.Player();
    Character.Enemy enemy = new tEnemy();
}

Combat 函数可以这样调用:

Combat<Character.Gnome>();
Combat<Character.Skeleton>();

另一种选择是在战斗功能中接受Type作为参数并像这样使用Activator.CreateInstance

static void Combat(Type enemyType)
{
    Character.Player player = new Character.Player();
    Character.Enemy enemy = Activator.CreateInstance(enemyType) as Character.Enemy;
}

这个函数可以像这样使用typeof操作符调用:

Combat(typeof(Character.Gnome));
Combat(typeof(Character.Skeleton));

使用泛型可以进行编译时检查,但灵活性较差。 将类型作为参数传递更灵活,但不会进行编译时检查。

【讨论】:

  • 非常感谢!不仅你帮助我解决了我的问题,而且感谢这个例子,我终于理解了泛型和 where 关键字。真的,你太棒了。
【解决方案2】:

使用Activator类如下
Activator.CreateInstance(enemyType.GetType())
它使用类型的默认构造函数

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多