加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 类设计 – 几种可能类型的属性

发布时间:2020-12-15 23:30:05 所属栏目:百科 来源:网络整理
导读:拿一个类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 DamageMod
拿一个类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保存对子类的引用,但这似乎也是错误的.

编辑基于评论:
我对Archer / Mage / Warrior类的意图是,除了当前存在的xxModifier属性之外,每个类都将拥有某些可用的方法(能力),这样战士可以(相对)减少伤害但具有更高的防御力和健康,角色类目前用作为玩家对象提供一个保持其角色的位置(RPG类)的方法.这个具体的实现是我的目标,这里列出的内容是我到目前为止所提出的.

>在这种情况下,角色类是否必要?
>假设有必要重新设计这些类,我怎样才能最好地编写这个,以便Player对象是Archer / Mage / Warrior?

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读