当前位置:  开发笔记 > 编程语言 > 正文

类设计 - 几种可能类型的属性

如何解决《类设计-几种可能类型的属性》经验,为你挑选了1个好方法。

拿一个类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,MageWarrior.但是,此特定子类型在运行时(或更具体地,在创建字符时)决定.

我试图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

您的设计是否是一个好主意(如评论中所讨论的)的问题稍微宽泛一些.



1> Matt Burland..:

对于如何在保留类型的同时序列化和反序列化为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

您的设计是否是一个好主意(如评论中所讨论的)的问题稍微宽泛一些.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有