2017-04-20 123 views
2

嗯,标题说,但我会更具体到我的情况,并解释我的问题。 我有以下类别:随时修改一个字段另一个字段被修改

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(属性智慧)方法,用一个新对象替换整个属性,其中我必须复制所有未修改的字段并替换我需要的字段。 这似乎有点笨拙和不雅。 你会选择哪种解决方案,更重要的是,对于如何处理这个有更好的想法吗?

+4

'base'是C#中的关键字,您不能将其用作变量名称。 – UnholySheep

+2

我认为[你正在寻找'INotifyPropertyChanged'](https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v = vs.110).aspx)。您的字段必须更改为属性,并且在处理属性时,您可以将方法'Total'和'Modifier'更改为只读属性,以符合标准的.NET用法。 –

+0

@UnholyShep:是的,我刚刚注意到了。我对C#很陌生,所以我不知道它。 – Harnak

回答

3

最简单的选择是根本不复制该值的副本,那么您不必跟踪将其复制到的位置以更新它。

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()); 

的总得分应该增加(假设将两个智慧增加了修改)抛类从未举办复制,但直接引用智慧。

+0

非常清楚,很好的解决方案。我会试试这个!非常感谢! – Harnak

+0

我有同样的问题,但有一个整数。 Player有一个'size'字段,ArmorClass有一个'size'字段。虽然我现在不得不复制它,因为这不是一个对象,而是一个原始的(我也不能只在ArmorClass中保留字段,因为我也需要在其他类的Player中使用它)。我应该使用指针吗?虽然它是'不安全的'领土,但我不确定这是否是正确的解决方案。或者我应该把它包装在课堂上并使用它? – Harnak

+0

@哈纳克装甲的大小是否会随着玩家的变化而变化?或者相反呢?如果需要连接,您可以简单地让玩家获得被称为“佩戴者”的盔甲属性或护甲为名为“WornArmor”的玩家的属性。 – nvoigt