方法中的冒号
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.x
和 this.y
的构造函数,并且然后执行它自己的代码,它有 none,最后执行 Cylinder 构造函数中的代码,设置 y
.
你是对的。当您创建 Cylinder
的实例时,首先执行 Shape
的构造函数,初始化 x
和 y
。然后执行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.
是有意义的
只是想确认我对方法中冒号的理解。我发现 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.x
和 this.y
的构造函数,并且然后执行它自己的代码,它有 none,最后执行 Cylinder 构造函数中的代码,设置 y
.
你是对的。当您创建 Cylinder
的实例时,首先执行 Shape
的构造函数,初始化 x
和 y
。然后执行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.
是有意义的