C# 构造函数缺陷
C# constructor flaw
这是我的部分代码:
class Tiger: Animal,IPredator
{
private double weight;
public static double AvgWeight;
public static int Population;
public static double TotalWeight;
public Tiger(double aWeight):this(aWeight,"Savannah"){}
public Tiger(double aWeight, params string[] aHabitat) : base(aWeight,"Panthera Tigris", "Mammalia", aHabitat)
{
Population++;
TotalWeight += Weight;
AvgWeight = TotalWeight / Population;
Console.WriteLine($"Let's all welcome our new Tiger: {Weight} kilos. Average pride weight: {AvgWeight}");
}
public override double Weight
{
get
{
return weight;
}
set
{
TotalWeight -= weight;
weight = value;
TotalWeight += weight;
AvgWeight = TotalWeight / Population;
}
}
看起来不错,但是当我创建一个实例并检查构造函数时,它显示新猫体重值的两倍。
Animal部分代码:
abstract class Animal
{
private string kind;
private string @class;
public List<string> Habitat = new List<string>();
public virtual double Weight { get; set; }
public string Kind { get { return kind; } set { } }
public string @Class { get { return kind; } set { Console.WriteLine("Class cannot be changed"); } }
public Animal(double aWeight,string aKind, string aClass,params string[] aHabitat)
{
kind = aKind;
@class = aClass;
Habitat.AddRange(aHabitat);
Weight = aWeight;
}
我试图避免这些问题,这就是为什么我在 Tiger 中添加了一个额外的双字段。但我需要 Tiger's 像这样工作,而 Animals 绝对应该有重量 属性。
好的,问题不在于继承或静态方法。它与 setter 和构造函数中的字符串相同:TotalWeight += value;
这是我的部分代码:
class Tiger: Animal,IPredator
{
private double weight;
public static double AvgWeight;
public static int Population;
public static double TotalWeight;
public Tiger(double aWeight):this(aWeight,"Savannah"){}
public Tiger(double aWeight, params string[] aHabitat) : base(aWeight,"Panthera Tigris", "Mammalia", aHabitat)
{
Population++;
TotalWeight += Weight;
AvgWeight = TotalWeight / Population;
Console.WriteLine($"Let's all welcome our new Tiger: {Weight} kilos. Average pride weight: {AvgWeight}");
}
public override double Weight
{
get
{
return weight;
}
set
{
TotalWeight -= weight;
weight = value;
TotalWeight += weight;
AvgWeight = TotalWeight / Population;
}
}
看起来不错,但是当我创建一个实例并检查构造函数时,它显示新猫体重值的两倍。
Animal部分代码:
abstract class Animal
{
private string kind;
private string @class;
public List<string> Habitat = new List<string>();
public virtual double Weight { get; set; }
public string Kind { get { return kind; } set { } }
public string @Class { get { return kind; } set { Console.WriteLine("Class cannot be changed"); } }
public Animal(double aWeight,string aKind, string aClass,params string[] aHabitat)
{
kind = aKind;
@class = aClass;
Habitat.AddRange(aHabitat);
Weight = aWeight;
}
我试图避免这些问题,这就是为什么我在 Tiger 中添加了一个额外的双字段。但我需要 Tiger's 像这样工作,而 Animals 绝对应该有重量 属性。
好的,问题不在于继承或静态方法。它与 setter 和构造函数中的字符串相同:TotalWeight += value;