c# – 类设计 – 几种可能类型的属性
拿一个类Player,它(当前)有一个Role类型的属性:
public class Player { public string Name { get; set; } public int Health { get; protected set; } public Role Role { get; set; } } Role包含一些不同的值: public class Role { public double DamageModifier { get { return _damageModifier; } } public double DefenseModifier { get { return _defenseModifier; } } public double HealthModifier { get { return _healthModifier; } } private double _damageModifier; private double _defenseModifier; private double _healthModifier; public Role(double damageMod,double defenseMod,double healthMod) { _damageModifier = damageMod; _defenseModifier = defenseMod; _healthModifier = healthMod; } } 并且有一些来自Role的“类”: public class Archer : Role { private const double _damageModifier = 1.2; private const double _defenseModifier = 0.9; private const double _healthModifier = 0.8; public Archer() : base(_damageModifier,_defenseModifier,_healthModifier) { } } public class Mage : Role { private const double _damageModifier = 1.4; private const double _defenseModifier = 0.7; private const double _healthModifier = 0.9; public Mage() : base(_damageModifier,_healthModifier) { } } public class Warrior : Role { private const double _damageModifier = 1.0; private const double _defenseModifier = 1.2; private const double _healthModifier = 1.0; public Warrior() : base(_damageModifier,_healthModifier) { } } 所有这一切的最终结果实际上只是Player.Role属性是一个占位符,可以成为Archer,Mage或Warrior.但是,此特定子类型在运行时(或更具体地,在创建字符时)决定. 我试图将播放器对象序列化为JSON数据而产生的问题.当JSON序列化Role属性时,它知道它是一个Role对象,并且能够从实例中获取相应的xxModifier值,但是我失去了Role属性是从Role派生的类这一事实. 我显然还在学习,但这种问题告诉我,我在设计这个课时搞砸了,需要修复它.我可以重构构造函数,以便Role保存对子类的引用,但这似乎也是错误的. 编辑基于评论: >在这种情况下,角色类是否必要? 解决方法
对于如何在保留类型的同时序列化和反序列化为JSON的直接问题,使用类似JSON.Net的东西,这是非常简单的:
var p = new Player() { Role = new Mage() }; var json = JsonConvert.SerializeObject(p,new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Objects }); 现在你JSON看起来像这样: { "$type": "MyApp.Program+Player,MyApp","Name": null," Health": 0,"Role": { "$type": "MyApp.Program+Mage,"DamageModifier": 1.4,"DefenseModifier": 0.7,"HealthModifier": 0.9 } } 添加其他$type属性,以便在反序列化时: var d = (Player)JsonConvert.DeserializeObject(json,typeof(Player),new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Objects }); var isMage = d.Role.GetType() == typeof(Mage); // true 您的设计是否是一个好主意(如评论中所讨论的)的问题稍微宽泛一些. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |