gpt4 book ai didi

c# - 返回 BaseClass 的任意子类的 BaseClass 方法

转载 作者:行者123 更新时间:2023-11-30 12:36:25 24 4
gpt4 key购买 nike

在我的游戏中,我有一个 Loot 基类,它具有对任何可以被玩家捡起并存储在他的元素栏中的东西通用的方法。这将包括药水、设备、弹药等。我可以装备箭,但不能装备药水。所以 Arrow 将是 Ammo 的一个子类,而 Ammo 最终将派生自 Loot。我可以喝药水,但不能喝箭。所以 Potion 会继承 Loot 但会实现 IConsumeable。等等。

战利品对象具有数量属性(10 支箭;2 种药水)。在我的 Loot 类中,我有一个名为 Split 的方法,它允许玩家获取“一堆”元素(如箭头)并将其分成两个单独的堆栈。因此它将 Arrow 实例的 Quantity 减少一定数量,然后返回一个新的 Arrow 实例,其 Quantity 值等于从原始实例中获取的值。

我的想法是,我会在 Loot 中编写该方法,因为只要其 int StackLimit 属性大于 1,任何 Loot 都可以堆叠。在按指定数量递减调用 Loot 后,我​​将返回一个新对象同类型的。问题是,我不知道该对象是什么类型的 Loot 子类。

public abstract class Loot
{
public int Quantity { get; set; }
public Loot Split(int quantityToTake)
{
Loot clone = (Loot)this.MemberwiseClone();
//RestrictNumberToRange(int min, int max, int value) is a delegate which clamps a value to min,max
this.Quantity -= Utility.RestrictNumberToRange<int>(1, this._quantity - 1, quantityToTake);
clone.Quantity = quantityToTake;
return clone;
}
}

这样做真的很糟糕吗?我考虑过 Reflection,但对于是否在这种情况下使用它,我听到了不同的意见。

没有办法定义处理this.FurthestSubClass的方法吗?

我知道我的子类可能有不同的构造函数,所以尝试返回 'new this.FurthestSubclass()' 可能不可行,因为我不知道如何构造它。但我希望能够处理它的 Loot 方法,所以我使用 Loot 作为返回类型。

最佳答案

我认为这是泛型的一个很好的例子。尝试像这样重写 Loot 中的 split 方法:

public TLoot Split<TLoot>(int quantityToTake) where TLoot : Loot
{
TLoot clone = (TLoot)this.MemberwiseClone();
...
return clone;
}

这应该可以解决打字问题。

编辑添加:构造函数问题更有趣一些,但您可能会发现无参数构造函数与对象初始化器结合使用很有用。如果按如下方式修改约束:

public TLoot Split<TLoot>(int quantityToTake) where TLoot : Loot, new(TLoot)
{
// stuff
TLoot newLoot = new TLoot();
...
return newLoot;
}

“new(T)”约束允许您基于通用类型创建新对象。

进一步编辑:我应该在这个上下文中给出一个对象初始化器的例子:

TLoot newLoot = new TLoot { Quantity = quantityToTake };

这假设 Loot 有一个名为 Quantity 的公共(public)属性。对象初始值设定项可以为具有 public set{};

的任何公共(public)属性设置值

关于c# - 返回 BaseClass 的任意子类的 BaseClass 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3326912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com