我应该使用什么变量类型来存储非密封类或接口的类型
本文关键字:类型 密封类 接口 存储 什么 变量 我应该 | 更新日期: 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# 代码。