【发布时间】:2011-01-12 05:08:11
【问题描述】:
让我先解释一下我想要实现的目标。
我正在制作一款玩家可以拾取道具的游戏(出于某种原因,我在游戏中将其称为“战利品”)。所以这是我的 Loot 类的一个非常基本的形式:
public class Loot : Sprite
{
//Properties and fields...
public Loot(/*parameters...*/)
{
}
public virtual OnPickUp(Player player)
{
}
}
Player 和 Sprite 是我的课程。这是我的问题:我的 sprite 类拥有一个位置(一个 Vector2,一个来自 XNA 的结构,表示一个向量),根据我对 C# 工作原理的理解,复制两个 sprite 将复制彼此的 reference,因此,每当我改变一个人的位置时,它也会改变另一个人的位置。
每当产生战利品时,我都有一个类持有可能产生的战利品,它会返回一个随机战利品,战利品会被复制并显示到屏幕上,但只要我得到多个相同类型的战利品loot,由于参考副本问题,它搞砸了(两者将共享相同的位置,只有一个可见)。
因此,每当我需要生成新的战利品时,我都会尝试创建一个新的 Loot 对象,因此我必须提供一个带有多个参数的构造函数,以便以这种方式轻松复制战利品: (让我们假设 toSpawn 可以是从 Loot 类派生的任何类型,例如 HealthPack 或其他)
Loot spawning = new Loot(toSpawn.Position, toSpawn.Color /*etc...*/);
在我决定实施“OnPickUp”之前,它看起来不错。由于我创建了一个新的 Loot 对象而不是正确的子类,所以 toSpawn 的 OnPickUp 函数的功能会消失并拾取战利品最终什么都不做(它只会调用基类 Loot 的空函数)。
显然,我在这里做错了什么。我没有太多的编程经验,更不用说 C#,所以我真的不知道如何解决这个问题。我尝试使用表示 OnPickUp 功能的 Action 对象,它可以工作但仍然限制了我很多(因为我必须将静态函数作为 Action 传递,因此限制我使用播放器的信息参数并阻止我使用子类特定信息)。
所以,最后,我的问题真的是:什么是更好的设计来允许具有重载函数的子类,但仍然能够克隆基类及其属性? p>
感谢您宝贵的时间。
如果有什么不够清楚(我知道还不够清楚),请在 cmets 中问我,我会尝试更详细地描述我的问题。
【问题讨论】:
-
听起来您只想在基类中创建一个
Clone或Copy虚函数,并让子类实现自己的复制功能。我错过了什么吗? -
基本上是的,但是我需要为我的 Loot 类的每个子类实现一个“复制”功能吗?对于 HealthPack、WeaponSpeedIncrease 等?
-
您的基类可以只调用MemberwiseClone,而每个子类只需复制无法复制的成员(例如,它们必须包含对不同
Location对象的引用)。 -
@Gabe 你为我省去了很多打字和代码重复... O_O 谢谢,不知道那个美妙的功能。
标签: c# xna polymorphism clone