Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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
游戏编程,原型模式:如何从C++;到C#?_C#_C++_Class_Generics_Prototype Programming - Fatal编程技术网

游戏编程,原型模式:如何从C++;到C#?

游戏编程,原型模式:如何从C++;到C#?,c#,c++,class,generics,prototype-programming,C#,C++,Class,Generics,Prototype Programming,在这本名为《游戏编程模式》的书中,作者在原型示例中展示了如何使用泛型类在游戏中生成怪物 免责声明:作者声明代码仅仅是为了给一个概念提供一个示例(可能并不完美) 这是给定例子中的C++代码: class Spawner { public: virtual ~Spawner() {} virtual Monster* spawnMonster() = 0; }; template <class T> class SpawnerFor : public Spawner { pub

在这本名为《游戏编程模式》的书中,作者在原型示例中展示了如何使用泛型类在游戏中生成怪物

免责声明:作者声明代码仅仅是为了给一个概念提供一个示例(可能并不完美)

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

class Spawner
{
public:
  virtual ~Spawner() {}
  virtual Monster* spawnMonster() = 0;
};

template <class T>
class SpawnerFor : public Spawner
{
public:
  virtual Monster* spawnMonster() { return new T(); }
};
< P>我的翻译是从C++到C是正确的吗?
谢谢你

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

公共类怪物
{
}
公共级幽灵:怪物
{
}
公共抽象类生成程序
{
公共抽象怪物产卵怪物();
}
公共类SpawnerFor:Spawner其中T:Monster,new()
{
公共覆盖怪物繁殖怪物(){返回新的T();}
}
然后:

var spawnerForGhost = new SpawnerFor<Ghost>();
var ghost = spawnerForGhost.SpawnMonster();
var spawnerForGhost=new SpawnerFor();
var ghost=spawnerForGhost.spawneMonster();

C#中的一个大限制是,您可以为无参数构造函数(
,new()
)的存在定义一个约束,如本例所示,但如果您希望您的
新怪物()
作为参数接收(
新怪物(位置)
),则它会崩溃(您不能对有参数的构造函数进行约束。您可以在
Monster
中明确定义
公共抽象初始化(位置)
,并从
spawnmoster(位置)
调用它。)

您能提供您的Ghost类的外观吗?我怀疑您没有公共Ghost()构造函数已定义。您是否确保
Ghost
继承自
Monster
(其中C#中的
Monster
可能是一个接口)?同样在C#中,我相信有一种方法可以指定泛型必须遵守某个接口。因此,您可能会说
类SpawnerTemplate,其中T:Moster
。我在问题中添加了Ghost类。Monster是基类(但目前不是抽象类)。此代码架构背后的逻辑称为模板。我不确定是否将SpawnerTamplate T更改为Monster,因为SpawnerTemplate是Spawner类的模板。我认为。
public class Spawner<T> {
    public virtual Monster SpawnMonster() {
        return null;
    }
}

class SpawnerTemplate<T> : Spawner { 
    public override Monster SpawnMonster() {
        return new T();
    }
}
  var ghost = new Spawner<Ghost>();
class SpawnerTemplate<T> : Spawner where T : new(){ 
    public override Monster SpawnMonster() {
        return new T() as Monster;
    }
}
var ghost = new SpawnerTemplate<Ghost>();
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);
    }
}
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(); }
}
var spawnerForGhost = new SpawnerFor<Ghost>();
var ghost = spawnerForGhost.SpawnMonster();