在C#中编写多个构造函数重载的最佳方法

aku作

我正在学习C#,并制作了一个简单的“玩家”课程。但是我很难承受多重超载。这是我最好的解决方案,但我觉得可以做得更好/更好。

class Player : Entity
    {
        public Player() {
            Name = "Player";
            XP = 0;
            LVL = 1;
            XPToLvlUp = 10;
            XpRank = 10;
        }

        public Player(string name) : this() {
            Name = name;
        }

        public Player(string name, int _Hp, int _Mp) : this(name) {
            HP = _Hp;
            MP = _Mp;
        }

        public Player(string name, int _Hp, int _Mp, int _Xp, int _Lvl) : this(name, _Hp, _Mp) {
            XP = _Xp;
            LVL = _Lvl;
        }

        public Player(string name, int _Hp, int _Mp, int _Xp, int _Lvl, int XpByRank) : this(name, _Hp, _Mp, _Xp, _Lvl) {
            XpRank = XpByRank;
        }

        //deleted code for better reading

        private int XPToLvlUp;
        private int XpRank;
        public int XP;
        public int LVL;
        public string Name;
    }  

好吗?如果不是,请告诉我原因。感谢您的回复!

花盆

您的课程几乎不错,可以接受。

简而言之:使用属性。

很长的故事:

首先制定或遵循命名规则,这将使您的代码更易于阅读。这取决于您,只是一个建议。对于由多个单词组成的复杂名称,可以使用CamelCasedNames并避免在可能有用的地方为所有类型的数据缩写名称。例如,您可能扩展LvlLevel,但XpExperience会看起来像一个奇怪的现象。这也取决于你。

string name; // local Variable, first character lower cased
private string _name; // private Field, first character is lower cased with leading "_"
public string Name { get; set; } // public Property, first character is upper cased

我将向您展示替代构造函数的替代方法,并将遵循命名规则。

1)构造函数的默认值(为简化起见,使用了类的一部分)

class Player
{
    public Player(string name = "Player", int xp = 0, int level = 1)
    {
        Name = name;
        Xp = xp;
        Level = level;
    }

    // Properties instead of Fields
    public int Xp { get; private set; } // restrict modification of the property outside of a class but reading is available
    public int Level { get; private set; }
    public string Name { get; set; }
} 

2)不带默认值的构造函数的属性

第一属性的目的是限制对数据的访问,以保持内部对象数据的一致性。即使您在代码中犯了错误。避免一些错误的好方法。

第二个属性的目的是在获取或设置代码时执行代码。例如,使属性相互依赖以存储更少且唯一的数据。

class Player
{
    public int Xp { get; private set; } = 0;
    public int Level { get; private set; } = 1;
    public string Name { get; set; } = "Player";
} 

用法

Player player = new Player() { Name = "KillerPWNZ", Level = 100, Xp = 999999 };

奖励:另一个属性功能

您可以在getset子句中执行任何代码

假设每个下一个玩家的等级都需要上一个等级的两倍,而第二等级需要100 XP。然后,您决定向第一个升级的玩家1000 XP开具发票。显然,您需要颠簸Level几次。假设Xp包含相对于Level价值。

发票

player.Xp += 1000;

带有代码的属性

private int _xp = 0;

public int Level { get; private set; } = 1;
public int Xp
{
    get => _xp; // same as: get { return _xp; }
    set
    {
        _xp = value; // here value is keyword containing data you want to set
        while (_xp >= GetXpPerLevel(Level))
        {
            _xp -= GetXpPerLevel(Level);
            Level++;
        }
        while (_xp < 0 && Level > 1)
        {
            _xp += GetXpPerLevel(Level - 1);
            Level--;
        }
    }
}

// helper method
private int GetXpPerLevel(int level)
{
    if (level < 1) return 0;

    // int result = 100;
    // for (int i = 1; i < level; i++) result *= 2;
    // return result;

    // or the same with some binary shift magic :)
    return 100 << (level - 1);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章