我有一些类具有多个属性,这些属性具有明确定义的名称和功能,但具有相同的实现.例如:
class Stats
{
private int attack;
public int Attack
{
get =>
HasBuff ? attack + 1 : attack;
set
{
if (value < 1 || value > 10)
throw new ArgumentOutOfRangeException("Invalid value");
attack = value;
}
}
public int Defense {...}
public int Speed {...}
}
Run Code Online (Sandbox Code Playgroud)
在哪里Defense和Speed将要实施就像Attack.如何概括此结构以避免冗余并使更改更容易?
创建另一个类来概括统计数据:
public class Stat
{
public bool HasBuff { get; set; }
private int _stat;
public int Score
{
get => HasBuff ? _stat + 1 : _stat;
set => _stat = value;
}
}
Run Code Online (Sandbox Code Playgroud)
然后只需将它用于您的每项技能:
public class CombatStats
{
public Stat Attack { get; } = new Stat();
public Stat Defense { get; } = new Stat();
public Stat Speed { get; } = new Stat();
}
Run Code Online (Sandbox Code Playgroud)
调用代码如下所示:
var ninja = new Ninja();
ninja.skills = new CombatStats();
var attackStrength = ninja.skills.Attack.Score;
Run Code Online (Sandbox Code Playgroud)
作为进一步改进,隐式运算符可用于避免对象创建和调用Score:
public class Stat
{
...
public static implicit operator int(Stat stat)
{
return stat.Score;
}
public static implicit operator Stat(int value)
{
return new Stat()
{
Score = value
};
}
}
Run Code Online (Sandbox Code Playgroud)
这使得对于写入问题的示例的客户端代码的更改是透明的:
ninja.skills = new CombatStats(){
Attack = 5,
Defense = 2
}
int attack = ninja.skills.Attack;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |