不同类型的字典,拉对象必须记住它的类型,最好的方法?
我试图找到最好的方法来创建一个可以容纳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();
但我不能想出一个优雅的方式与要做到这一点一个集合。
当您拉出物品时,您是否总是知道您预期的原始子类型?如果是的话,你可以尝试投你使用它之前拉出对象:
var tempRewardItem = Item_Inventory.GetSpecificItem("LosenedBowels") as DeathSoundEffect; // Could also use 'as isSoundEffect'
if (tempRewardItem != null)
{
tempRewardItem.PlaySound();
}
是的,我会知道在选择物品之前我会寻找哪种子类型的物品。在这种情况下,它的特定DeathSoundEffect“LosenedBowels”。将会有一个随机卷,选择应该选择哪种类型,然后基于此选择集合中的任意子类型项目。 –
啊,如果你必须选择某个子类型的随机项目,那么你可能需要重新考虑列表结构(可能是列表字典,其中的关键字是每个子类型),如否则你将不得不迭代通过一堆坏/不适合的物品,然后才能找到所有正确的类型,这不是很有效。 你可以将它封装在一个类/方法中,从消费代码的角度来看,它仍然是一个单独的调用(类似于'Item_Inventory.GetRandomItemOfType(Type)')。 – mech
@mech检查是否检索到对象['is isSoundEffect'](https://stackoverflow.com/a/3561214/1663383),如果是,则将其转换为'isSoundEffect'并调用PlaySound()方法。另外,'isSoundEffect'是一个可怕的名字。 ISoundEffect会更好。 'I'让你(作为程序员)记住它是一个接口。然后它遵循用于类名称的标准UpperCamelCase约定。 – Draco18s
在我的脑海里,以接近这一点的最好办法是让执行任何逻辑与特定'奖励关联的虚拟方法'你在使用/接收。在每个继承的类中,重写该方法,以便它们每个都有不同的表现。如果你们所有的课程都没有足够的相似之处来做到这一点,或许把它们全部集成到一个巨大的集合中并不是正确的方法? – Serlite
我得到你的说法,你可能是对的,因为子类型(继承奖励类)将是以下任一类型或变体之一: 改变soundeffect, 视觉效果, playermodel。 我可以deffinetly争论的情况下,它应该分裂,但由于有5个变量的所有子类型将使用,它似乎是理想的,如果我可以让他们继承它从同一个地方(奖励)。 –