C# 传递给方法的成员变量和参数之间的区别

C# difference between member variables and arguments passed to a method

我正在完成一项具有非常具体说明的作业,如果有任何兴趣,我将 post 在我创建的代码下方。但是,简而言之,我要创建一个 BasicShape 摘要 class,以及一个 CircleRectangle subclasses。每个subclass都有计算形状面积的方法。该面积是使用成员变量计算的。但是,在我下面的代码中,这些成员变量从未被赋值。我对如何将它分配给它们感到困惑,因为 CircleRectangle 方法也需要将参数传递给它们。这些参数 xyr for Circlewl for Rectangle 在主程序中指定时创建了一个形状的新实例,但这些值似乎也没有任何作用,因为输出始终为 0。传递给方法的参数与成员变量有什么关系?当调用 CircleRectangle 实例时通过参数集给出值时,如何为成员变量赋值?

这是我的代码:

abstract class BasicShape
{
    protected double area;

    public double getArea()
    {
        Console.WriteLine("Area: {0}", area);
        return area;
    }

    public virtual void calcArea()
    {

    }
}

class Circle : BasicShape
{
    private int centerX;
    private int centerY;
    private double radius;

    public Circle(int x, int y, double r)
    {
        calcArea();
    }      


    public int genCenterX()
    {
        return centerX;
    }

    public int genCenterY()
    {
        return centerY;
    }

    public override void calcArea()
    {
        area = 3.14159 * radius * radius;
        Console.WriteLine("The area of the circle is: {0}", area);
    }

}

class Rectangle : BasicShape
{
    private int width;
    private int length;

    public Rectangle(int w, int l)
    {
        calcArea();
    }

    public int getWidth()
    {
        return width;
    }

    public int getLength()
    {
        return length;
    }

    public override void calcArea()
    {
        area = length * width;
        Console.WriteLine("The area of the rectangle is: {0}", area);
    }
}

public class TestShapes
{
    static void Main(string[] args)
    {
        Circle circle1 = new Circle(2, 2, 5);
        Rectangle rectangle = new Rectangle(6, 7);

        Console.ReadLine();
    }
}

作业说明如下:

定义一个名为 BasicShape 的纯抽象基础 class。 BasicShape class 应具有以下成员:

私有成员变量: area,用于保存形状面积的双精度值。

Public 成员方法: getArea():这个方法应该return成员变量area中的值。 calcArea(): 这个方法应该是一个纯虚方法。

接下来,定义一个 class 命名的 Circle。它应该来自 BasicShape class。它应该有以下成员:

私有成员变量: centerX,一个整数,用于保存圆心的 x 坐标。 centerY,一个整数,用于保存圆心的 y 坐标。 radius, double 用于保存圆的半径。

Public 成员方法:

Circle(int x, int y, int r):接受 centerX、centerY 和 radius 的值。应该调用覆盖的 calcArea 方法如下所述。

genCenterX:return编辑了 centerX 中的值

genCenterY:return编辑中心 Y 中的值

calcArea():计算圆的面积(面积=3.14159 *半径*半径)并将结果保存在继承的成员区域中。

接下来,定义一个 class 命名的矩形。它应该来自 BasicShape class。它应该有以下成员: 私有成员变量:

width,一个整数,用来保存矩形的宽度 length,一个整数,用来保存矩形的长度

Public 成员方法:

Rectangle(int w, int l):接受宽度和长度的值。应该调用下面描述的重写的 calcArea 方法。

getWidth(): returns 宽度值。 getLength(): returns 长度值 calcArea():计算圆的面积(面积=长*宽)并将结果保存在继承的成员区域中。

创建这些 classes 后,创建一个定义 Circle 对象和 Rectangle 对象的主程序。

证明每个物体都正确计算并报告了它的面积。

您没有将从构造函数传递的值分配给您的成员变量。因此,当您调用 calcArea 时,您使用类型 int 或 double(为零)的默认值执行它

class Circle : BasicShape
{
    private int centerX;
    private int centerY;
    private double radius;

    public Circle(int x, int y, double r)
    {
        radius = r;
        // Now you are executing the calcArea using the value passed in
        calcArea();
    }      
    ....
}

class Rectangle : BasicShape
{
    private int width;
    private int length;

    public Rectangle(int w, int l)
    {
        width = w;
        length = l;
        calcArea();
    }
    ....
}

calcArea 的重写需要将成员变量设置为其他值,否则这些成员变量将使用它们的默认值(整数和双精度均为零)初始化,因此方法无法产生有意义的结果。