Jes*_*ond 2 c# polymorphism xna clone
让我首先尝试解释一下我想要实现的目标。
我正在制作一款游戏,玩家可以拾取能量提升(出于某种原因,我在游戏中将其称为“战利品”)。这是我的 Loot 类的基本形式:
public class Loot : Sprite
{
//Properties and fields...
public Loot(/*parameters...*/)
{
}
public virtual OnPickUp(Player player)
{
}
}
Run Code Online (Sandbox Code Playgroud)
Player和Sprite是我的课程。这是我的问题:我的精灵类持有一个位置(Vector2,来自 XNA 的表示向量的结构),根据我对 C# 工作原理的理解,复制两个精灵将复制彼此的引用,因此,每当我更改一个位置时,它也会改变别人的。
每当一个战利品应该产生时,我有一个类保存可能产生的战利品,它返回一个随机的战利品,并且战利品被复制并显示在屏幕上,但是一旦我获得多个相同类型的战利品,它就会由于参考副本问题而混乱(两者将共享相同的位置,并且只有一个可见)。
因此,每当我需要生成新的战利品时,我都会尝试创建一个新的战利品对象,因此我必须提供一个具有多个参数的构造函数,以便以这种方式轻松复制战利品:(让我们假设 toSpawn 可以是从 Loot 类派生的任何类型,比如 HealthPack,或者其他什么)
Loot spawning = new Loot(toSpawn.Position, toSpawn.Color /*etc...*/);
Run Code Online (Sandbox Code Playgroud)
在我决定实施“OnPickUp”之前,它看起来是正确的。由于我创建了一个新的Loot对象而不是正确的子类,因此toSpawn的OnPickUp函数的功能将消失,拾取战利品最终将不执行任何操作(它只会调用基类 Loot 的空函数)。
显然,我在这里做错了什么。我没有太多的编程经验,更不用说 C# 了,所以我真的不知道如何解决这个问题。我尝试使用代表 OnPickUp 功能的 Action< Player> 对象,它可以工作,但仍然限制我很多(因为我必须将静态函数作为 Action< Player> 传递,因此限制我使用玩家的信息参数并阻止我使用子类特定信息)。
所以,最后,我的问题实际上是:什么是更好的设计,允许具有重载函数的子类,但仍然能够克隆基类及其属性?
感谢您宝贵的时间。
如果有什么不够清楚(我知道不是),那么只需在评论中询问我,我会尝试更详细地描述我的问题。
让你的 Loot 类实现ICloneable
public abstract class Loot : ICloneable
{
public virtual object Clone()
{
Type type = this.GetType();
Loot newLoot = (Loot) Activator.CreateInstance(type);
//do copying here
return newLoot;
}
}
Run Code Online (Sandbox Code Playgroud)