C# 如何在WP7 XNA中克隆抽象类的子类

C# 如何在WP7 XNA中克隆抽象类的子类,c#,windows-phone-7,xna,C#,Windows Phone 7,Xna,我正在为XNA制作WP7游戏。以下是我的结构: public abstract class enemy {} 子元素: public class genericEnemy : enemy{} ... public class snake : enemy {} 等等 在WP7中,似乎有很多东西被移动和/或删除(特别是序列化)。尽管进行了大量的搜索,我还是没有找到解决方案。我正在尝试复制子元素 例如:在加载关卡时,我将三个不同敌人的阵列传递到加载阶段。在加载过程中,我需要复制每个敌人,以便每个敌

我正在为XNA制作WP7游戏。以下是我的结构:

public abstract class enemy
{}
子元素:

public class genericEnemy : enemy{}
...
public class snake : enemy {}
等等

在WP7中,似乎有很多东西被移动和/或删除(特别是序列化)。尽管进行了大量的搜索,我还是没有找到解决方案。我正在尝试复制子元素

例如:在加载关卡时,我将三个不同敌人的阵列传递到加载阶段。在加载过程中,我需要复制每个敌人,以便每个敌人中有20个在游戏中飞行,做自己的事情


我看到的所有解决方案都引用了WP7库中不存在的东西。

创建一个敌人工厂,它可以从某种id创建敌人。加载关卡时,需要创建敌人时,可以呼叫工厂:

class EnemyFactory
{
 Enemy CreateEnemy(int id)
 {
  if (id == 0)
   return new Snake();
  return new GenericEnemy();
 }

}


void LoadLevel()
{
 // bla bla
 Level level = new Level();
 int enemyId = LoadFromFile();
 level.AddEnemy(EnemyFactory.CreateEnemy(enemyId));
}
通过这种方式,您可以摆脱讨厌的克隆代码,并且可以控制工厂类中的所有敌人实例化

据我所知,没有“图书馆”这样做的方法。一种解决办法是:

1) 在敌人中声明一个Clone()方法,该方法返回该敌人的副本

abstract class Enemy {
     public abstract Enemy Clone();
}
2) 在每种具体类型中实现它,这样一条蛇就会创建一条新的蛇,等等。例如:

class Snake : Enemy {
     int speed;
     public override void Enemy Clone() {
         var clone = new Snake();
         clone.speed = speed;
         return clone;
     }
}

3) 现在,任何具体类型的对象都知道如何克隆自己,因此如果你有一系列敌人,你可以对每个敌人调用clone(),它将以适当的方式创建适当的具体类型。

使用一个调用复制构造函数的抽象方法:

public abstract class Enemy
{
   private readonly int mEnemyData;

   protected Enemy(Enemy pEnemy)
   {
      mEnemyData = pEnemy.mEnemyData;
   }

   public abstract Enemy Clone();
}

public sealed class GenericEnemy : Enemy
{
   private readonly double mGenericEnemyData;

   private GenericEnemy(GenericEnemy pGenericEnemy)
    : base(pGenericEnemy)
   {
      mGenericEnemyData = pGenericEnemy.mGenericEnemyData;
   }

   public override Enemy Clone()
   {
      return new GenericEnemy(this);
   }
}

难道你不可能访问它们的公共属性并复制它们吗?或者,您可以编辑类定义以添加.Clone()方法吗?(你说的子元素是什么意思?)我最初是这样构造代码的,但希望有一个更简单的方法。经过研究,这似乎是完成我正在做的事情的最简单的方法。