我应该使用什么变量类型来存储非密封类或接口的类型

本文关键字:类型 密封类 接口 存储 什么 变量 我应该 | 更新日期: 2023-09-27 18:33:04

>自述文件

  • 我有成千上万的生物,每个生物都来自生物
  • 生物的一个例子是Creature_MoonDancer
  • Creature 是一个类,只有在将 CreatureData 对象传递到其构造函数中时才能实例化。
  • 我想找到一种方法来限定任何继承自的密封类型Creature to One CreatureData in a Dictionary.
  • 每个生物最多只能链接 1 个实例生物数据库字典中的生物数据

下面是 CreatureData,一个包含需要馈送到 Creature 构造函数中以实例化它的信息的类:

--CreatureData.cs
using UnityEngine.UI;
[System.Serializable]
class CreatureData {
    //To be set by Unity engine's inspector.
    [SerializeField] private Sprite creatureHead;
    [SerializeField] private int creatureStartingDamage;
    Sprite CreatureHead {
        get{
            return creatureHead;
        }
    }
    Sprite CreatureStartingDamage {
        get{
            return creatureStartingDamage;
        }
    }
}

在这里,我有一个抽象类 Creature,它包含了生物是什么。

--Creature.cs
public class Creature {
    protected Sprite creatureHead;
    protected int creatureDamage;
    public Creature(CreatureData creatureData){
        creatureHead = creatureData.CreatureHead;
        creatureDamage = creatureData.CreatureStartingDamage
    }
    public abstract void getAttackedBy(Creature other);
}

有数以千计的密封生物类型源自生物,这里有一个例子:

--Creature_MoonDancer.cs
public sealed class Creature_MoonDancer : Creature{
    private int moonOrbsInPossession;
    public Creature_MoonDancer (CreatureData creatureData, int startingMoonOrbs) : base(creatureData){
        moonOrbsInPossession = startingMoonOrbs;
    }
    public override void getAttackedBy(Creature other){
        if(moonOrbsInPossession > other.creatureDamage){
            Debug.Log("MoondancerWins");
        }
        else if(Random.value < 0.5)
            Debug.Log("MoondancerDies");
        else
            Debug.Log("MoondancerWins");
    }
}

CreatureDatabase 将包含一个字典,用于存储 CreatureData,并将从 Creature 派生的任何密封类链接到最多 1 个相应的 CreatureData

--CreatureDatabase.cs
public class CreatureDatabase : MonoBehaviour {
    private static class CreatureDataCustomSerializableDictionary
        : CustomSerializableDictionary<typeof(Creature),CreatureData> {}
    //TODO: Create custom property drawer for CustomSerializableDictionary
    [SerializeField] private CreatureDataCustomSerializableDictionary creatureDatabaseDictionary;
    public CreatureDatabaseDictionary {
        get{
            return creatureDatabaseDictionary;
        }
    }
}

以下是游戏管理器试图从 creatureDatabaseDictionary Dictionary 中获取值:

--GameManager.cs
public class GameManager : MonoBehaviour{
    [SerializeField] private CreatureDatabase creatureDatabase;
    private Creature SummonMoonDancer(){
        CreatureData creatureData;
        bool success = creatureDatabase.CreatureDatabaseDictionary.TryGetValue(typeof(Creature_MoonDancer), out creatureData);
        if(success == false){
            Debug.LogError("Tried summoning MoonDancer when creature database did not have a typeof(MoonDancer) key");
        }
        else{
            return new Creature_MoonDancer(creatureData), Player.GetInt("NumberOfMoonorbsInPlayersPouch");
        }
    }
}

以下是一些项目要求:

    游戏平衡
  • 团队需要平衡游戏,没有修改代码。
  • 重要提示:游戏平衡团队不得插入任何键值对不是生物类型的键。

我应该使用什么变量类型来存储非密封类或接口的类型

下面是您编写的代码,以便使用示例赋值进行编译:

public interface mybaby {}
public class mytom : mybaby {}
public class mydick : mybaby {}
public class myharry : mybaby {}
public class Test
{
    mybaby mychild = new myharry();
}

这是有效的有效 C# 代码。