Добавить в цитаты Настройки чтения

Страница 166 из 502

Как видите, у абстрактного метода отсутствует тело. Модификатор abstract может применяться только в методах экземпляра, но не в статических методах (static). Абстрактными могут быть также индексаторы и свойства.

Класс, содержащий один или больше абстрактных методов, должен быть также объявлен как абстрактный, и для этого перед его объявлением class указывается модификатор abstract. А поскольку реализация абстрактного класса не определяется полностью, то у него не может быть объектов. Следовательно, попытка создать объект абстрактного класса с помощью оператора new приведет к ошибке во время компиляции.

Когда производный класс наследует абстрактный класс, в нем должны быть реализованы все абстрактные методы базового класса. В противном случае производный класс должен быть также определен как abstract. Таким образом, атрибут abstract наследуется до тех пор, пока не будет достигнута полная реализация класса.

Используя абстрактный класс, мы можем усовершенствовать рассматривавшийся ранее класс TwoDShape. Для неопределенной двухмерной фигуры понятие площади не имеет никакого смысла, поэтому в приведенном ниже варианте класса TwoDShape метод Area() и сам класс TwoDShape объявляются как abstract. Это, конечно, означает, что во всех классах, производных от класса TwoDShape, должен быть переопределен метод Area().

<b>// Создать абстрактный класс, </b>

<b>using System;</b>

<b>abstract class TwoDShape { </b>

<b>  double pri_width; </b>

<b>  double pri_height;</b>

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

<b>  public TwoDShape() {</b>

<b>    Width = Height =0.0; </b>

<b>    name = &quot;null&quot;;</b>

<b>  }</b>

<b>  // Параметризированный конструктор.</b>

<b>  public TwoDShape(double w, double h, string n) {</b>

<b>    Width = w;</b>

<b>    Height = h; </b>

<b>    name = n;</b>

<b>  }</b>

<b>  // Сконструировать объект равной ширины и высоты, </b>

<b>  public TwoDShape(double x, string n) {</b>

<b>    Width = Height = x; </b>

<b>    name = n;</b>

<b>  }</b>

<b>  // Сконструировать копию объекта TwoDShape. </b>

<b>  public TwoDShape(TwoDShape ob) {</b>

<b>    Width = ob.Width;</b>

<b>    Height = ob.Height; </b>

<b>    name = ob.name;</b>

<b>  }</b>

<b>  // Свойства ширины и высоты объекта, </b>

<b>  public double Width {</b>

<b>    get { return pri_width; }</b>

<b>    set { pri_width = value &lt; 0 ? -value : value; }</b>

<b>  }</b>

<b>  public double Height {</b>

<b>    get { return pri_height; }</b>

<b>    set { pri_height = value &lt; 0 ? -value :    value; }</b>

<b>  }</b>

<b>  public string name { get; set; } </b>

<b>  public void ShowDim() {</b>

<b>    Console.WriteLine(&quot;Ширина и высота равны &quot; +</b>

<b>           Width + &quot; и &quot; + Height);</b>

<b>  }</b>

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

<b>  public abstract double Area();</b>

<b>}</b>

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

<b>class Triangle : TwoDShape { </b>

<b>  string Style;</b>

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

<b>  public Triangle() {</b>

<b>    Style = &quot;null&quot;;</b>

<b>  }</b>

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

<b>  public Triangle(string s, double w, double h) </b>

<b>         : base(w, h, &quot;треугольник&quot;) {</b>

<b>    Style = s;</b>

<b>  }</b>

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

<b>  public Triangle(double x) : base(x, &quot;треугольник&quot;) {</b>

<b>    Style = &quot;равнобедренный&quot;;</b>