Просто пытаюсь подтвердить мое понимание двоеточия в методе. Я нашел сообщение это, в котором объясняется, что код после двоеточия запускается до вызываемого метода.
Означает ли это, что с код ниже, что Shape запускается до Circle? А Круг запускается перед Цилиндром?
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
*/
@Plutonix, какое время быть живым! (если бы это было так)
Кстати, в любом метод есть нетдвоеточие. Однако в вашем определение класса есть двоеточие.





Для конструкторов (имена функций с тем же именем, что и имя класса): указывает, что конструктор базового класса будет вызван и будет выполняться первым с любыми переданными параметрами перед кодом дочернего конструктора.
Таким образом, для функции public Cylinder(double radius, double height) : base(radius) конструктор Circle выполняется перед кодом в конструкторе Cylinder, который, в свою очередь, вызывает конструктор для параметра Shape this.x и this.y, а затем выполняет свой собственный код, которого у него нет, а затем, наконец, код в Конструктор цилиндров выполнен, установка y.
Ты прав. Когда вы создаете экземпляр Cylinder, сначала выполняется конструктор Shape, инициализируя x и y. Затем выполняется конструктор Circle, инициализирующий radius. Наконец, выполняется конструктор Cylinder, заменяющий y на height.
Обратите внимание, что этот синтаксис : base работает только с конструктором. По обычным методам это не работает. Для обычных методов вы делаете это:
public void Method1() {
base.Method1(); // to call the base class implementation first
}
И этот шаблон вызова конструктора базового класса прежде, чем что-либо еще имеет смысл, не так ли? Каждый подкласс - это специализация своих прямых суперклассов. Поэтому имеет смысл сначала «сконструировать» суперкласс, а затем «сконструировать» более специализированный подкласс.
Да, сначала запускается базовый конструктор.