C# 我应该使用什么变量类型来存储非密封类或接口的类型? 自述 我有成千上万的生物,每一种生物都来自 生物 生物的一个例子是生物\月亮舞者 creative是一个类,只有将creatiuredata对象传递到其构造函数中,才能实例化该类 我想找到一种方法来确定继承自的任何密封类型的范围 生物到一个字典中的生物数据 每个生物最多只能链接一个实例 creatureDatabaseDictionary中的CreatureData
下面是CreatureData,一个类,其中包含的信息需要输入到生物的构造函数中进行实例化:C# 我应该使用什么变量类型来存储非密封类或接口的类型? 自述 我有成千上万的生物,每一种生物都来自 生物 生物的一个例子是生物\月亮舞者 creative是一个类,只有将creatiuredata对象传递到其构造函数中,才能实例化该类 我想找到一种方法来确定继承自的任何密封类型的范围 生物到一个字典中的生物数据 每个生物最多只能链接一个实例 creatureDatabaseDictionary中的CreatureData,c#,class,types,interface,C#,Class,Types,Interface,下面是CreatureData,一个类,其中包含的信息需要输入到生物的构造函数中进行实例化: --CreatureData.cs using UnityEngine.UI; [System.Serializable] class CreatureData { //To be set by Unity engine's inspector. [SerializeField] private Sprite creatureHead; [SerializeField] pr
--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.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");
}
}
以下是一些项目要求:
- 游戏平衡团队需要在没有任何限制的情况下平衡游戏 修改代码
- 重要信息:游戏平衡团队不得插入任何具有 不是生物类型的钥匙
public interface mybaby {}
public class mytom : mybaby {}
public class mydick : mybaby {}
public class myharry : mybaby {}
public class Test
{
mybaby mychild = new myharry();
}
这是有效的C代码。为什么
typeof(mybaby)
而不仅仅是mybaby
?它不是typeof(string)message=“hello”代码>我不想在mychild中存储以mybaby为基础的对象的实例。我只想将mybaby作为基础的非密封类或接口的类型存储到mychild中。无论如何,无法创建抽象类的实例。一种方法是创建一个所有mybaby孩子都实现的IBaby接口,然后需要一个类型
变量。不能将可能的值约束到特定类型的子类,除非将其包装到属性中并执行运行时检查。如果要存储类型,请使用类型
类型。typeof
运算符返回一个Type
对象,然后可以将该对象分配给Type
类型的变量。OP询问-(1)如果myharry
有许多数据成员并浪费大量内存怎么办?(2) 我想保留使myharry
成为抽象类的自由。我不知道有多少数据成员会影响这一点。我不明白为什么它会浪费很多内存。您是否认为通过将myharry
分配给mybaby
它会以某种方式改变类型?没有。它仍然是一个myharry
类型,它只是作为mybaby
类型分配给变量。最终,您需要创建一个可以分配给mybaby
的对象实例。因此,如果myharry
是抽象的,那么您将拥有公共类my孙子:myharry{…}
,然后您将使用它,比如mybaby mychild=new my孙子()代码>。关于内存浪费,我没有理由在代码中使用mychild实例。我所需要的只是类型。@RyanAWE-声誉是为了给人们时间去理解规则。例如,回答自己的问题,而不是留下评论或编辑问题
--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();
}