首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GameProgramming,原型模式:如何将泛型类从C++转换为C#?

GameProgramming,原型模式:如何将泛型类从C++转换为C#?
EN

Stack Overflow用户
提问于 2020-12-28 16:05:55
回答 1查看 62关注 0票数 0

在这本名为“游戏编程模式”的引人入胜的书中,作者在原型示例中展示了如何使用泛型类在游戏中生成怪物。

免责声明:作者确实指出,代码只是为了给一个概念提供一个示例(而且可能不是完美的)。

这是给定示例中的C++代码:

代码语言:javascript
复制
class Spawner
{
public:
  virtual ~Spawner() {}
  virtual Monster* spawnMonster() = 0;
};

template <class T>
class SpawnerFor : public Spawner
{
public:
  virtual Monster* spawnMonster() { return new T(); }
};

调用类将运行:

代码语言:javascript
复制
Spawner* ghostSpawner = new SpawnerFor<Ghost>();

我尝试将此示例转换为C#,以便在一个场景中对它进行测试:

代码语言:javascript
复制
public class Spawner<T> {
    public virtual Monster SpawnMonster() {
        return null;
    }
}

class SpawnerTemplate<T> : Spawner { 
    public override Monster SpawnMonster() {
        return new T();
    }
}

场景中的脚本将运行:

代码语言:javascript
复制
  var ghost = new Spawner<Ghost>();

Visual不编译,因此我重写如下:

代码语言:javascript
复制
class SpawnerTemplate<T> : Spawner where T : new(){ 
    public override Monster SpawnMonster() {
        return new T() as Monster;
    }
}

调用时仍然存在编译错误:

代码语言:javascript
复制
var ghost = new SpawnerTemplate<Ghost>();

必须是具有公共无参数构造函数的非抽象类型,才能将其用作参数。

Ghost代码是这样的:

代码语言:javascript
复制
public class Ghost : Monster
{
    public Ghost (int health, int speed) {
        this.health = health;
        this.speed = speed;
    }

    public override Monster Clone() {
        return new Ghost(health, speed);
    }
}

我从C++到C#的翻译正确吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-12-28 18:00:35

不确定这种模式在C#中是否有用,但是:

代码语言:javascript
复制
public class Monster
{
}

public class Ghost : Monster
{
}

public abstract class Spawner
{
    public abstract Monster SpawnMonster();
}

public class SpawnerFor<T> : Spawner where T : Monster, new()
{
    public override Monster SpawnMonster() { return new T(); }
}

然后:

代码语言:javascript
复制
var spawnerForGhost = new SpawnerFor<Ghost>();
var ghost = spawnerForGhost.SpawnMonster();

C#的最大限制是可以为无参数构造函数(, new())的存在定义约束,如本例所示,但是如果您希望以参数形式接收new Monster() (new Monster(location)),那么它就会崩溃(参数构造函数不能有约束)。您可以在Monster中明确地定义一个Monster并从SpawnMonster(Location location)调用它)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65480489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档