我有两节课。一个包含数据和行为。另一个是输入和显示数据。当我从另一个类中调用一个类的方法来显示结果时,它返回零。
任何帮助......谢谢
数据和行为:
class CalculateArea
{
private const double PI = 3.14;
private double cirArea;
private double recArea;
private double cilArea;
private double radius;
private double length, width;
private int height;
// Constructors
public CalculateArea(double radius1)
{
radius = radius1;
}
public double CalculateCircleArea()
{
cirArea = (PI * (radius * radius));
return cirArea;
}
public CalculateArea(int height1)
{
height = height1;
}
public CalculateArea(double lenght1 , double width1)
{
length = lenght1;
width = width1;
}
//public CalculateArea()
//{
// TODO: Complete member initialization
//}
// methods
//
public double CalculateRectangleArea()
{
recArea = (length * width);
return recArea;
}
//
public double CalculateCylinderArea()
{
cilArea = (PI * (radius * radius) * height);
return cilArea;
}
}
输入和显示:
class Program
{
static void Main(string[] args)
{
string number;
Console.WriteLine("Which figure do you want to see calculated select a number");
Console.WriteLine("Circle : 1");
Console.WriteLine("Rectangle : 2");
Console.WriteLine("Cylinder : 3");
number= Console.ReadLine();
int numb=Convert.ToInt32(number);
if (numb == 1)
{
Console.WriteLine("Enter the radius for circle");
string rad;
rad = Console.ReadLine();
int radiusX = Convert.ToInt32(rad);
CalculateArea newCal1 = new CalculateArea(radiusX);
Console.WriteLine("The result of calculation is {0}", newCal1.CalculateCircleArea());
}
else if(numb == 2)
{
Console.WriteLine("Enter the length ");
number = Console.ReadLine();
double lenght;
lenght = Convert.ToDouble(number);
Console.WriteLine("Enter the width ");
number = Console.ReadLine();
double width;
width = Convert.ToDouble(number);
CalculateArea newCal2=new CalculateArea(lenght , width);
Console.WriteLine("The result of calculation is {0}" , newCal2.CalculateRectangleArea());
}
else if (numb == 3)
{
Console.WriteLine("Enter the height ");
number = Console.ReadLine();
int height;
height = Convert.ToInt32(number);
Console.WriteLine("Enter the radius");
number = Console.ReadLine();
int radius;
radius = Convert.ToInt32(number);
CalculateArea newCal3 = new CalculateArea(height, radius);
Console.WriteLine("The reslut of calculation is {0}", newCal3.CalculateCylinderArea());
}
else
{
Console.WriteLine("There is no any calculation number check the information and try again");
}
Console.ReadLine();
}
答案 0 :(得分:2)
以下代码:
CalculateArea newCal1 = new CalculateArea(radiusX);
调用以下构造函数:
public CalculateArea(int height1)
{
height = height1;
}
因为radiusX是INTEGER ...
因此,该值存储在高度中,而不是半径中。 因此,当您调用方法来计算圆的面积时,它会使用半径计算,即为0.0。
CalculateCylinderArea也使用半径和高度,但构造函数只使用两个参数,高度和宽度。 因此,在方法3中,它也失败",因为半径和宽度是0.0
矩形的计算有效。
要解决圆圈问题,您需要将raiusX变量更改为double。
要解决气缸问题,例如,您可以更改例程以使用长度和宽度而不是半径和高度。
但是作为旁注,还有更好的方法来做你想做的事情:)
答案 1 :(得分:0)
除了@Jauch的答案之外,我还想提供一些额外的信息。
如果类型(类或结构)中的多个方法具有相同的名称,则称它们被重载。只有在它们具有不同的形式参数列表时才允许这样做。参数名称无关紧要;只有他们的数量和类型。返回类型也无关紧要。
您的问题与Overload resolution有关。这就是C#为了找出必须调用哪个重载版本所做的事情。重要的是要理解这是在编译时发生的,而不是在运行时发生的。这意味着传递的具体值无关紧要,因为它们在编译时是未知的。只有实际参数的类型才有意义。
请按照上面的链接获取规范,但Jon Skeet的文章可能更易于理解:C# in Depth: Overloading。