检索有关实现接口

时间:2017-04-21 16:34:19

标签: c# interface casting subclass

我对我写的代码有一些疑问,我希望你能够帮助我或帮助我找到更好的解决方案。

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

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类,其中我有一些插槽:weaponSlot,armorSlot等。在这里,我需要检索有关这些项目的信息;例如,我需要检索护甲加值。我需要做这样的事情:

int armorBonus = armorSlot.Item.Bonus;

显然这不会起作用,因为Slot类型中的Item只是一个Equippable而且不一定具有Bonus属性。所以我提出了两个解决方案:

  1. 赋予Equippable Bonus属性:我可以在Equippable中放置一个Bonus属性,该属性将由每个类实现。这样一切都会好起来的。 虽然,但对我来说并不完全正确,因为并非所有项目都需要奖金。我将如何处理Bonus属性以及不需要它的项目类型?将它保留为默认值? 不是这个笨拙的
  2. 执行广告:我可以通过以下显式转换来解决问题,但我不习惯投射,所以我不确定我是否会这样做。我忽略了什么。这是一个很好的方法吗?
  3. 以下是代码:

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

    扰乱我在这里是因为我应该小心为每个插槽提供正确的项目类型(我不知道直到运行时异常),因为插槽没有&# 39;不知道它允许包含什么类型的可装备。

    好吧,我在写作时提出了另一个想法,所以我会把它放在这里:

    1. 告诉Slot它可以容纳哪个项目:这是第二个解决方案的改进而不是新解决方案。我可以在Slot中存储一个字符串(甚至是Enum)来告诉它它可以接受哪个项目,所以我确信我正在进行正确的投射。虽然,如何检查它是否收到了正确类型的项目? 更重要的是,我认为我应该做无论如何这样的事情,以避免将项目分配到错误的插槽。
    2. 您对如何改善这一点有任何想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

然后,您可以根据所需的特定插槽类型在Player上定义某些类型的插槽。例如:

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

这样做的好处是你不需要写一个&#34;单独的&#34;每个Equippable的插槽类,但您可以强制执行每个插槽可以使用的特定类型的设备。