使用属性封装的简单程序.. Farmer有字段snumberofCows
和feedMultiplier
,
并写入控制台BagsOfFeed= numberofCows* feedMultiplier
namespace numberOfCows
{
class Farmer
{
private int bagsOfFeed;
//public const int FeedMultiplier = 30;
private int numberOfCows;
private int feedMultiplier;
//private int bagsOfFeed;
public Farmer(int numberOfCows, int feedMultiplie)
{
feedMultiplier = feedMultiplie;
//this.feedMultiplier = feedMultiplie;
NumberOfCows = numberOfCows;
//this.numberOfCows = numberOfCows;
}
public int FeedMultiplier { get { return feedMultiplier; } }
public int NumberOfCows
{
get
{
return numberOfCows;
}
set
{
numberOfCows = value;
//BagsOfFeed = numberOfCows * FeedMultiplier;
}
}
//READ ONLY PROPERTY
public int BagsOfFeed {
get { return bagsOfFeed; }
set { bagsOfFeed = NumberOfCows * FeedMultiplier; }
}
}
}
当电话farmer = new Farmer( 15,30 ); Console.WriteLine("I need {0} bags of feed for {1} cows",farmer.BagsOfFeed, farmer.NumberOfCows);
返回0 BagsOfFeed
时......所以我不知道我哪里出错了。[我认为属性用于检索要读取的值。 ..还是什么时候我应该使用私人套装..]
答案 0 :(得分:4)
BagsOfFeed
setter永远不会被调用(并且不应该被调用,因为它是根据其他属性的值计算的)。此属性应如下所示:
//READ ONLY PROPERTY
public int BagsOfFeed {
get { return NumberOfCows * FeedMultiplier; }
}
有了它,private int bagsOfFeed;
可以删除,因为它是不必要的。
答案 1 :(得分:4)
永远不会调用set
的{{1}}方法,因为您永远不会BagsOfFeed
,因此永远不会进行计算。您应该在BagsOfFeed = something;
方法中进行计算,然后删除该字段。您的课程还有其他不需要存在的字段。例如,使用get
属性,您可以使用FeedMultiplier
(这称为auto-property),而不是仅使用带有支持字段的private set;
。它可以改写为:
get
这会在您的示例中显示正确的结果:
我需要450袋饲料喂养15头奶牛