检索有关 类 实现接口的信息

Retrieve information about the classes implementing an interface

我对我正在编写的代码有一些疑问,希望您能启发我或帮助我找到更好的解决方案。

我有一个 Player class,其中包含一些 Slot 类型的成员。每个 Slot(下面的代码)都包含一个 Equippable,这是一个由特定 classes 实现的接口,如 Armor、Weapon、Shield、MagicItem。我需要这样做,因为我不想为每种类型的可装备物品写一个插槽 class。

class Slot{
    private Equippable item;
    public Equippable Item = > item;
    // here is constructor with default null item
    // here are some methods to occupy/free slot
}

现在让我们回到 Player class,其中我有一些插槽:weaponSlot、armorSlot 等。在这里我需要检索有关项目的信息;例如,我需要取回护甲奖励。我需要做这样的事情:

int armorBonus = armorSlot.Item.Bonus;

显然这行不通,因为 Slot 类型中的 Item 只是一个 Equippable,不一定有 Bonus 属性。所以我想到了两个解决方案:

  1. 给 Equippable 奖励 属性:我可以在 Equippable 中放置一个奖励 属性,每个 class 都会实施。通过这种方式,一切都会好起来的。 虽然,但我觉得并不完全正确,因为并非所有物品都需要奖励。我将如何处理不需要它的项目类型的 Bonus 属性?保留默认值? 这不是笨拙吗
  2. 执行一次转换: 我可以通过以下显式转换来解决这种情况,但我不太习惯转换,所以我不确定我是否俯视某物。这是继续进行的好方法吗?

代码如下:

Armor armor = (Armor)armorSlot.Item;
int armorBonus = armor.Bonus;

这里打扰我的是,我应该小心地为每个插槽提供正确的项目类型(直到 运行-时间异常我才知道), 因为插槽不知道它允许包含什么类型的 Equippable。

嗯,我在写的时候想到了另一个想法,所以我把它放在这里:

  1. 告诉 Slot 它可以容纳哪个项目:这是对第二个解决方案的改进,而不是新的解决方案。我可以在 Slot 中存储一个字符串(甚至是一个枚举),以告诉它它可以接受哪个项目,所以我确信我正在做一个正确的转换。但是,我如何检查它是否收到了正确类型的项目? 而且,我想我应该做这样的事情 无论如何 以避免将项目分配到错误的位置。

您有什么改进方法吗?

您可以将 Slot 定义为通用 class。

class Slot<T> where T : Equippable {
    // ...
}

然后你可以根据你想要的特定插槽类型在播放器上定义特定类型的插槽。例如:

class Player {
    Slot<Armor> ArmorSlot { get; set; }
    Slot<Weapon> WeaponSlot { get; set; }
}

这样做的好处是你不需要为每个 Equippable 写一个 "separate" 插槽 class,但是你可以强制每个插槽可以使用的特定类型的设备.