Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы по Технологии программирования / Использование абстрактных классов

.docx
Скачиваний:
6
Добавлен:
21.05.2015
Размер:
8.74 Кб
Скачать

Иногда полезно создать базовый класс, определяющий только своего рода "пустой бланк", который унаследуют все производные классы, причем каждый из них заполнит этот "бланк" собственной информацией. Такой класс определяет "суть" методов, которые производные классы должны реализовать, но сам при этом не обеспечивает реализации одного или нескольких методов. Подобная ситуация может возникнуть, когда базовый класс попросту не в состоянии реализовать метод.

Абстрактный метод создается с помощью модификатора типа abstract. Абстрактный метод не содержит тела и, следовательно, не реализуется базовым классом. Поэтому производный класс должен его переопределить, поскольку он не может использовать версию, предложенную в базовом классе. Нетрудно догадаться, что абстрактный метод автоматически является виртуальным, поэтому и нет необходимости в использовании модификатора virtual. Более того, совместное использование модификаторов virtual и abstract считается ошибкой.

Для объявления абстрактного метода используйте следующий формат записи.

abstract ТИП ИМЯ(список_параметров) ;

Тело абстрактного метода отсутствует. Модификатор abstract можно использовать только применительно к обычным, а не к static-методам. Свойства также могут быть абстрактными.

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

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

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

using System;

abstract class TwoDShape {

double pri_width; // Закрытыйчлен,

double pri_height; // Закрытыйчлен,

string pri_name; // Закрытыйчлен.

public TwoDShape() {// Конструктор по умолчанию,

width = height = 0.0;

name = "null";

}

// Конструктор с параметрами.

public TwoDShape(double w, double h, string n) {

width = w;height = h;name = n;

}

// Создаем объект, у которого ширина равна высоте,

public TwoDShape(double x, string n) {

width = height = x;name = n;

}

// Создаемобъектизобъекта,

public TwoDShape(TwoDShape ob) {

width = ob.width;height = ob.height;name = ob.name;

}

// Свойства width, height и name,

public double width {

get { return pri_width; }set { pri_width = value; }

}

public double height {

get { return pri_height; }set { pri_height = value; }

}

public string name {

get { return pri__name; }set { pri_name = value; }

}

public void showDim() {

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

width + " и " + height);

}

// Теперьметодаrеа() абстрактный,

publicabstractdoublearea();

}

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

class Triangle : TwoDShape {

string style; // Закрытыйчлен.

// Конструктор по умолчанию,

public Triangle() {

style = "null";

}

// Конструктор с параметрами.

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

base(w, h, "triangle") {

style = s;

}

// Создаемравнобедренныйтреугольник.

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

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

}

// Создаемобъектизобъекта. ,

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

style = ob.style;

}

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

public override double area() {return width * height / 2 ;}

// Отображаемтиптреугольника,

public void showStyle() {

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

}

}

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

class Rectangle : TwoDShape {

// Конструкторспараметрами.

public Rectangle(double w, double h) :

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

// Создаем квадрат.

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

// Создаемобъектизобъекта.

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

// Метод возвращает значение true, если

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

public bool isSquare() {

if (width == height) return true;

return false;

}

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

public override double area() {

return width * height;

}}

class AbsShape {

public 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();

}}}