方法中的冒号

Colon in the method

只是想确认我对方法中冒号的理解。我发现 this post 解释了冒号后面的代码是 运行 在被调用方法之前。

这是否意味着形状下方的 code 是圆形之前的 运行? Circle 在 Cylinder 之前 运行?

public abstract class Shape
{
    public const double pi = Math.PI;
    protected double x, y;

    public Shape(double x, double y) => (this.x, this.y) = (x, y);
    public abstract double Area();
}
public class Circle : Shape
{
    public Circle(double radius) : base(radius, 0) { }
    public override double Area() => pi * x * x;
}
public class Cylinder : Circle
{
    public Cylinder(double radius, double height) : base(radius) => y = height;
    public override double Area() => (2 * base.Area()) + (2 * pi * x * y);
}
public class TestShapes
{
    private static void Main()
    {
        double radius = 2.5;
        double height = 3.0;

        Circle ring = new Circle(radius);
        Cylinder tube = new Cylinder(radius, height);

        Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
        Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
Area of the circle = 19.63
Area of the cylinder = 86.39
*/

对于构造函数(与 class 名称同名的函数名称),: 表示将调用基础 class 的构造函数并将首先执行,并带有任何传递的参数,在子构造函数的代码之前。

因此对于函数 public Cylinder(double radius, double height) : base(radius),Circle 的构造函数在 Cylinder 构造函数中的代码之前执行,而 Cylinder 构造函数又调用 Shape 设置 this.xthis.y 的构造函数,并且然后执行它自己的代码,它有 none,最后执行 Cylinder 构造函数中的代码,设置 y.

你是对的。当您创建 Cylinder 的实例时,首先执行 Shape 的构造函数,初始化 xy。然后执行Circle的构造函数,初始化radius。最后执行Cylinder的构造函数,将y改为height.

请注意,此 : base 语法仅适用于构造函数。它不适用于普通方法。对于普通方法,你这样做:

public void Method1() {
    base.Method1(); // to call the base class implementation first
}

这种先调用基础 class 构造函数的模式很有意义,不是吗?每个 subclass 都是其直接 superclasses 的特化。所以首先 "construct" superclass,然后 "construct" 更专业的 subclass.

是有意义的