随时修改一个字段另一个字段被修改
嗯,标题说,但我会更具体到我的情况,并解释我的问题。 我有以下类别:随时修改一个字段另一个字段被修改
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;
}
}
让我们说,现在我有属性的智慧和意志SavingThrow一个玩家A。每当第一被修改,例如:
A.Wisdom.Score = 12;
然后,第二,必须修改作为结果。在这个例子中,我应该做:
A.Will.Bonus = A.Wisdom.Modifier();
就如何实现这一目标任何想法?
我想到了下面的解决方案,但它不满足我,因为我要解释。
我不会定义getter,所以只能通过预定义的公共方法(例如SetWisdom(int score))来完成对Wisdom的外部访问,并在该方法中更新Will。但是,问题在于,如果我必须修改tempScore或misc,我必须制定另一种方法。 看起来效率很低,特别是如果我添加更多的字段到属性类。
否则,我可以使用SetWisdom(属性智慧)方法,用一个新对象替换整个属性,其中我必须复制所有未修改的字段并替换我需要的字段。 这似乎有点笨拙和不雅。 你会选择哪种解决方案,更重要的是,对于如何处理这个有更好的想法吗?
最简单的选择是根本不复制该值的副本,那么您不必跟踪将其复制到的位置以更新它。
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;
}
}
你的类可以这样使用,如果设置在构造函数中的属性:因为节省
Attribute wisdom = new Attribute(16);
SavingThrow will = new SavingThrow(wisdom);
Console.WriteLine(will.Total());
wisdom.Add(2);
Console.WriteLine(will.Total());
的总得分应该增加(假设将两个智慧增加了修改)抛类从未举办复制,但直接引用智慧。
非常清楚,很好的解决方案。我会试试这个!非常感谢! – Harnak
我有同样的问题,但有一个整数。 Player有一个'size'字段,ArmorClass有一个'size'字段。虽然我现在不得不复制它,因为这不是一个对象,而是一个原始的(我也不能只在ArmorClass中保留字段,因为我也需要在其他类的Player中使用它)。我应该使用指针吗?虽然它是'不安全的'领土,但我不确定这是否是正确的解决方案。或者我应该把它包装在课堂上并使用它? – Harnak
@哈纳克装甲的大小是否会随着玩家的变化而变化?或者相反呢?如果需要连接,您可以简单地让玩家获得被称为“佩戴者”的盔甲属性或护甲为名为“WornArmor”的玩家的属性。 – nvoigt
'base'是C#中的关键字,您不能将其用作变量名称。 – UnholySheep
我认为[你正在寻找'INotifyPropertyChanged'](https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v = vs.110).aspx)。您的字段必须更改为属性,并且在处理属性时,您可以将方法'Total'和'Modifier'更改为只读属性,以符合标准的.NET用法。 –
@UnholyShep:是的,我刚刚注意到了。我对C#很陌生,所以我不知道它。 – Harnak