在修改另一个字段的任何时候修改字段

时间:2017-04-20 16:16:04

标签: c# field

嗯,标题说明了,但我会更具体地了解我的情况并解释我的问题。 我有以下课程:

class Attribute{
    private int score;
    private int tempScore;
    private int misc;

    // here I have getters and setters
    // A method
    public int Modifier(){
        return (score+tempScore-10)/2;
    }
}

class SavingThrow{
    private int base;
    private int resistance;
    private int bonus;
    private int misc;

    //Getters and setters here
    //A method
    public int Total(){
        return base + resistance + bonus + misc;
    }
}

让我们说现在我有一个属性智慧的玩家A和一个SavingThrow会玩。每当修改第一个时,例如:

A.Wisdom.Score = 12;

然后,必须修改第二个。在这个例子中,我应该:

A.Will.Bonus = A.Wisdom.Modifier();

关于如何实现这个的任何想法?

我想到了以下解决方案,但由于我要解释的原因,它并不能让我满意。
我不会定义getter,因此只能通过预先定义的公共方法(比如SetWisdom(int score))来完成对Wisdom的外部访问,并且在该方法中我更新了Will。虽然,问题是,如果我必须修改tempScore或misc,我必须采用另一种方法来实现它。 看起来非常不合理,特别是如果我向Attribute类添加更多字段 另外,我可以使用SetWisdom(属性智慧)方法,用新对象替换整个属性,我必须复制所有未修改的字段并替换我需要的字段。 这看起来有点笨拙和不优雅。 你会选择哪种解决方案,更重要的是,你对如何处理这个有更好的想法吗?

1 个答案:

答案 0 :(得分:3)

最简单的选择是根本不复制该值,然后您不必跟踪复制它的位置以进行更新。

pd.DataFrame({'one' : [0,1,2,3,0,1],'two' : [0,0,1,0,1,2]})

   one  two
0    0    0
1    1    0
2    2    1
3    3    0
4    0    1
5    1    2

如果在构造函数中设置属性,则可以像这样使用您的类:

class SavingThrow{
    private int base;
    private int resistance;
    private Attribute attribute;
    private int misc;

    //Getters and setters here
    //A method
    public int Total(){
        return base + resistance + attribute.Modifier + misc;
    }
}

总得分应该增加(假设增加两个智慧会增加修饰符)因为豁免检定类从不持有副本,而是直接引用智慧。