如何概括属性模式

rzi*_*ppo 3 c#

我有一些类具有多个属性,这些属性具有明确定义的名称和功能,但具有相同的实现.例如:

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)

在哪里DefenseSpeed将要实施就像Attack.如何概括此结构以避免冗余并使更改更容易?

McG*_*V10 5

创建另一个类来概括统计数据:

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)