我正在学习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
。并避免在可能有用的地方为所有类型的数据缩写名称。例如,您可能扩展Lvl
到Level
,但Xp
到Experience
会看起来像一个奇怪的现象。这也取决于你。
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 };
奖励:另一个属性功能
您可以在get
或set
子句中执行任何代码。
假设每个下一个玩家的等级都需要上一个等级的两倍,而第二等级需要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] 删除。
我来说两句