首先让我解释一下我要实现的目标。

我正在制作一款游戏,玩家可以在游戏中拾取道具(由于某种原因,我称其为“战利品”)。所以这是我的Loot类的一个非常基本的形式:

public class Loot : Sprite
{
    //Properties and fields...

    public Loot(/*parameters...*/)
    {
    }

    public virtual OnPickUp(Player player)
    {
    }
}


Player和Sprite是我的课程。这是我的问题:我的Sprite类拥有一个位置(Vector2,它是XNA中表示矢量的结构),并且根据我对C#的工作原理的理解,复制两个Sprite会复制彼此的引用,因此,每当我更改位置时,也会改变另一个。

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

因此,当我需要生成新的战利品时,我尝试创建一个新的Loot对象,因此我必须为构造函数提供多个参数,以这种方式轻松复制战利品:
(让我们假装成Spawn可以是从Loot类派生的任何类型,例如HealthPack或其他任何类型)

Loot spawning = new Loot(toSpawn.Position, toSpawn.Color /*etc...*/);


在我决定实施“ OnPickUp”之前,它看起来一直不错。由于我创建了一个新的Loot对象,而不是适当的子类,因此toSpawn的OnPickUp函数的功能将消失,拾取赃物最终将无济于事(它只会调用基类Loot的empty函数)。

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

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

谢谢您的宝贵时间。

如果尚不清楚(我知道还不清楚),请在评论中问我,我将尝试更详细地描述我的问题。

最佳答案

让您的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;
    }
}

关于c# - C#多态性与克隆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4665530/

10-10 13:20