只是试图用一种方法来确认我对结肠的理解。我发现有this个帖子,它解释了冒号之后的代码在被调用方法之前运行。
这是否意味着Shape下方的code在Circle之前运行?而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
*/
答案 0 :(得分:0)
对于构造函数(函数名称与类名称相同的函数名称),:表示将调用基类的构造函数,并在子构造函数的代码之前使用任何传递的参数首先执行该构造函数。
因此,对于功能public Cylinder(double radius, double height) : base(radius)
,在Cylinder构造函数中的代码之前执行Circle的构造函数,然后依次调用Shape设置this.x
和this.y
的构造函数,然后执行自己的代码,没有代码,然后执行Cylinder构造函数中的代码,设置y
。
答案 1 :(得分:0)
你是对的。创建Cylinder
的实例时,将首先执行Shape
的构造函数,初始化x
和y
。然后执行Circle
的构造函数,初始化radius
。最后,执行Cylinder
的构造函数,将y
更改为height
。
请注意,此: base
语法仅适用于构造函数。它不适用于普通方法。对于普通方法,您可以这样做:
public void Method1() {
base.Method1(); // to call the base class implementation first
}
这种在其他任何事情之前都调用基类构造函数的模式对吗?每个子类都是其直接超类的特殊化。因此,首先“构造”超类,然后“构造”更专门的子类是有意义的。