不同类型的字典,拉对象必须记住它的类型,最好的方法?

问题描述:

我试图找到最好的方法来创建一个可以容纳6个不同的抽象奖励类型的子类型的字典,同时还记得当再次拉出时个别项目的原始子类型。有几种方法已经奏效,但我觉得它们都不合格,并且必须有更好的解决方案。不同类型的字典,拉对象必须记住它的类型,最好的方法?

的解决方案,工作原理,但我认为可能在加以改进:

  • 用于奖励各子类型列表。 (由于我添加了大量的子类型,因此不能很好地缩放)

  • 列表列表。 (这是丑陋的,看起来效率低下)

  • 多维数组。 (同样的问题列表的列表)

这里是我的方案的相关类片段:


public class RewardAssetContainer : MonoBehaviour 
{ 
// Sounds 
private static AudioClip losenedBowels = new AudioClip(); 
public static AudioClip LosenedBowels { get { return losenedBowels; } } 
} 

public abstract class Reward 
{ 
protected EffectTypes effectType; 
protected Rareity rareity; 
protected Sprite itemIcon; 
protected string itemName; 
protected GameObject specialEffect; 
} 

interface iSoundEffect 
{ 
void SetVolume(float _newVol); 
void PlaySound(); 
void StopSound(); 
} 

class DeathSoundEffect: Reward, iSoundEffect 
{ 
    private AudioSource sound; 

public DeathSoundEffect(string _itemName, AudioClip _sound, float _vol, EffectTypes _effectType, Rareity _rareity, Sprite _itemIcon) 
{ 
    sound = new AudioSource(); 

    itemName = _itemName; 
    sound.volume = _vol; 
    sound.clip = _sound; 
    effectType = _effectType; 
    rareity = _rareity; 
    itemIcon = _itemIcon; 
} 

public void PlaySound() 
{ 
    sound.Play(); 
} 
} 

public class Item_Inventory : MonoBehaviour 
{ 
private static Dictionary<string, Reward> rewardItemsOwned = new Dictionary<string, Reward>(); 
public static Reward GetSpecificItem(string _keyValue) { return rewardItemsOwned[_keyValue]; } 

    private void TestPutToInventory() 
{ 
    rewardItemsOwned.Add("LosenedBowels", new DeathSoundEffect("LosenedBowels", RewardAssetContainer.LosenedBowels, 0.5f, EffectTypes.DeathSoundEffect, Rareity.Rare, RewardAssetContainer.EpicExample)); 

} 
} 

我想,在不同的类,能够做这样的事情:

var tempRewardItem = Item_Inventory.GetSpecificItem("LosenedBowels"); 

    tempRewardItem .PlaySound(); 

但我不能想出一个优雅的方式与要做到这一点一个集合。

+0

在我的脑海里,以接近这一点的最好办法是让执行任何逻辑与特定'奖励关联的虚拟方法'你在使用/接收。在每个继承的类中,重写该方法,以便它们每个都有不同的表现。如果你们所有的课程都没有足够的相似之处来做到这一点,或许把它们全部集成到一个巨大的集合中并不是正确的方法? – Serlite

+0

我得到你的说法,你可能是对的,因为子类型(继承奖励类)将是以下任一类型或变体之一: 改变soundeffect, 视觉效果, playermodel。 我可以deffinetly争论的情况下,它应该分裂,但由于有5个变量的所有子类型将使用,它似乎是理想的,如果我可以让他们继承它从同一个地方(奖励)。 –

当您拉出物品时,您是否总是知道您预期的原始子类型?如果是的话,你可以尝试投你使用它之前拉出对象:

var tempRewardItem = Item_Inventory.GetSpecificItem("LosenedBowels") as DeathSoundEffect; // Could also use 'as isSoundEffect' 
if (tempRewardItem != null) 
{ 
    tempRewardItem.PlaySound(); 
} 
+0

是的,我会知道在选择物品之前我会寻找哪种子类型的物品。在这种情况下,它的特定DeathSoundEffect“LosenedBowels”。将会有一个随机卷,选择应该选择哪种类型,然后基于此选择集合中的任意子类型项目。 –

+0

啊,如果你必须选择某个子类型的随机项目,那么你可能需要重新考虑列表结构(可能是列表字典,其中的关键字是每个子类型),如否则你将不得不迭代通过一堆坏/不适合的物品,然后才能找到所有正确的类型,这不是很有效。 你可以将它封装在一个类/方法中,从消费代码的角度来看,它仍然是一个单独的调用(类似于'Item_Inventory.GetRandomItemOfType(Type)')。 – mech

+0

@mech检查是否检索到对象['is isSoundEffect'](https://*.com/a/3561214/1663383),如果是,则将其转换为'isSoundEffect'并调用PlaySound()方法。另外,'isSoundEffect'是一个可怕的名字。 ISoundEffect会更好。 'I'让你(作为程序员)记住它是一个接口。然后它遵循用于类名称的标准UpperCamelCase约定。 – Draco18s