游戏编程,原型模式:如何从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();