C# 多态性与克隆

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)

PlayerSprite是我的课程。这是我的问题:我的精灵类持有一个位置(Vector2,来自 XNA 的表示向量的结构),根据我对 C# 工作原理的理解,复制两个精灵将复制彼此的引用,因此,每当我更改一个位置时,它也会改变别人的。

每当一个战利品应该产生时,我有一个类保存可能产生的战利品,它返回一个随机的战利品,并且战利品被复制并显示在屏幕上,但是一旦我获得多个相同类型的战利品,它就会由于参考副本问题而混乱(两者将共享相同的位置,并且只有一个可见)。

因此,每当我需要生成新的战利品时,我都会尝试创建一个新的战利品对象,因此我必须提供一个具有多个参数的构造函数,以便以这种方式轻松复制战利品:(让我们假设 toSpawn 可以是从 Loot 类派生的任何类型,比如 HealthPack,或者其他什么)

Loot spawning = new Loot(toSpawn.Position, toSpawn.Color /*etc...*/);
Run Code Online (Sandbox Code Playgroud)

在我决定实施“OnPickUp”之前,它看起来是正确的。由于我创建了一个新的Loot对象而不是正确的子类,因此toSpawnOnPickUp函数的功能将消失,拾取战利品最终将不执行任何操作(它只会调用基类 Loot 的空函数)。

显然,我在这里做错了什么。我没有太多的编程经验,更不用说 C# 了,所以我真的不知道如何解决这个问题。我尝试使用代表 OnPickUp 功能的 Action< Player> 对象,它可以工作,但仍然限制我很多(因为我必须将静态函数作为 Action< Player> 传递,因此限制我使用玩家的信息参数并阻止我使用子类特定信息)。

所以,最后,我的问题实际上是:什么是更好的设计,允许具有重载函数的子类,但仍然能够克隆基类及其属性?

感谢您宝贵的时间。

如果有什么不够清楚(我知道不是),那么只需在评论中询问我,我会尝试更详细地描述我的问题。

Vad*_*dim 5

让你的 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)