get { return pri_width; }

    set { pri_width = value < 0 ? -value : value; }

  }

  public double Height {

    get { return pri_height; }

    set { pri_height = value < 0 ? -value :    value; }

  }

  public string name { get; set; }

  public void ShowDim() {

    Console.WriteLine("Ширина и высота равны " +

           Width + " и " + Height);

  }

  // Теперь метод Area() является абстрактным,

  public abstract double Area();

}

// Класс для треугольников, производный от класса TwoDShape.

class Triangle : TwoDShape {

  string Style;

  // Конструктор, используемый по умолчанию,

  public Triangle() {

    Style = "null";

  }

  // Конструктор для класса Triangle,

  public Triangle(string s, double w, double h)

         : base(w, h, "треугольник") {

    Style = s;

  }

  // Сконструировать равнобедренный треугольник,

  public Triangle(double x) : base(x, "треугольник") {

    Style = "равнобедренный";

  }

  // Сконструировать копию объекта типа Triangle,

  public Triangle(Triangle ob) : base(ob) {

    Style = ob.Style;

  }

  // Переопределить метод Area() для класса Triangle,

  public override double Area() {

    return Width * Height / 2;

  }

  // Показать тип треугольника,

  public void ShowStyle() {

    Console.WriteLine("Треугольник " + Style);

  }

}

// Класс для прямоугольников, производный от класса TwoDShape

class Rectangle : TwoDShape {

  // Конструктор для класса Rectangle,

  public Rectangle(double w, double h)

               : base(w, h, "прямоугольник"){ }

  // Сконструировать квадрат,

  public Rectangle(double x) : base (x, "прямоугольник") { }

  // Сконструировать копию объекта типа Rectangle,

  public Rectangle(Rectangle ob) : base(ob) { }

  // Возвратить логическое значение true, если

  // прямоугольник окажется квадратом,

  public bool IsSquare() {

    if(Width == Height) return true;

    return false;

  }

  // Переопределить метод Area() для класса Rectangle,

  public override double Area() {

    return Width * Height;

  }

}

class AbsShape {

  static void Main() {

    TwoDShape[] shapes = new TwoDShape[4];

    shapes[0] = new Triangle("прямоугольный", 8.0, 12.0);

    shapes[1] = new Rectangle(10) ;

    shapes[2] = new Rectangle(10, 4);

    shapes[3] = new Triangle(7.0);

    for(int i=0; i < shapes.Length; i++) {

      Console.WriteLine("Объект — " + shapes[i].name);

      Console.WriteLine("Площадь равна " + shapes[i].Area());

      Console.WriteLine() ;

    }

  }

}

Как показывает представленный выше пример программы, во всех производных классах метод Area() должен быть непременно переопределен, а также объявлен абстрактным. Убедитесь в этом сами, попробовав создать производный класс, в котором не переопределен метод Area(). В итоге вы получите сообщение об ошибке во время компиляции. Конечно, возможность создавать ссылки на объекты типа TwoDShape по-прежнему существует, и это было сделано в приведенном выше примере программы, но объявлять объекты типа TwoDShape уже нельзя. Именно поэтому массив shapes сокращен в методе Main() до 4 элементов, а объект типа TwoDShape для общей двухмерной формы больше не создается.

Перейти на страницу:

Похожие книги