拿一个类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, _defenseModifier, _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, _defenseModifier, _healthModifier) { } }
所有这一切的最终结果确实是刚才说的Player.Role
属性是什么将成为一个占位符Archer
,Mage
或Warrior
.但是,此特定子类型在运行时(或更具体地,在创建字符时)决定.
我试图serialize
将玩家对象转换为JSON
数据而产生的问题.当JSON
序列化的Role
属性,它知道,它是一个Role
对象,并能获得相应的xxModifier
从实例中的值,但我失去的事实,Role
性质是从派生的类Role
.
我显然还在学习,但这种问题告诉我,我在设计这个课时搞砸了,需要修复它.我可以重构构造函数,以便Role
保存对子类的引用,但这似乎也是错误的.
编辑基于评论:我对Archer/Mage/Warrior
课程的意图是每个课程都有某些方法(能力),除了xxModifier
目前存在的属性,这样Warrior
做(相对)会减少伤害,但具有更高的防御和健康,Role
该类目前用作为Player
对象提供一个位置来保存其角色(RPG类)的方法.这个具体的实现是我的目标,这里列出的内容是我到目前为止所提出的.
Role
在这种情况下,班级是否必要?
假设有必要重新设计这些类,我怎样才能最好地编写这个类以便Player
对象是一个 Archer/Mage/Warrior
?
Matt Burland.. 5
对于如何在保留类型的同时序列化和反序列化为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, MyApp", "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
您的设计是否是一个好主意(如评论中所讨论的)的问题稍微宽泛一些.
对于如何在保留类型的同时序列化和反序列化为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, MyApp", "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
您的设计是否是一个好主意(如评论中所讨论的)的问题稍微宽泛一些.