嗯,标题说明了,但我会更具体地了解我的情况并解释我的问题。 我有以下课程:
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(属性智慧)方法,用新对象替换整个属性,我必须复制所有未修改的字段并替换我需要的字段。 这看起来有点笨拙和不优雅。
你会选择哪种解决方案,更重要的是,你对如何处理这个有更好的想法吗?
答案 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;
}
}
总得分应该增加(假设增加两个智慧会增加修饰符)因为豁免检定类从不持有副本,而是直接引用智慧。