Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Download 2.46 Mb.
|
Язык программирования C#
9.5. Абстрактные классы
Обычно классы, включающие в себя виртуальные члены, не используются на прямую, и их виртуальные члены не нуждаются в конкретной реализации. Реальная реализация и их виртуальных членов происходит только в производных классах, которые их реализацией. Таким образом, класс является контрактом, который обязаны выполнить все производные от него классы. Чтобы создать класс-контракт, не реализующий объявленные в нм методы, используется спецификатор abstract, поэту такие классы и называются абстрактными. Спецификатор abstract может стоять перед как классом, так и перед методом, свойством или индексатором. Поле, помеченное спецификатором abstract, автоматически является виртуальным, поэтому помечать его дополнительным спецификатором virtual запрещено. Общий формат определения абстрактных классов имеет следующий вид. abstract class имя_класса { // тело класса } Используя абстрактные классы, создадим иерархию классов для работы с геометрическими фигурами на плоскости. Создадим сначала абстрактный класс фигуры Shape, а затем производные от него классы треугольник Triangle и квадрат Quadrangle. При их определении воспользуемся классом точки Point из листинга 9.11. abstract class Shape { protected Point[] Coordinates; public abstract void Draw(); } class Triangle : Shape { public override void Draw() { Console.WriteLine("Треугольник:"); for (int i = 0; i < Coordinates.Length; i++) Console.WriteLine("({0},{1})", Coordinates[i].X, Coordinates[i].Y); } public Triangle(double X1, double Y1, double X2, double Y2, double X3, double Y3) { Coordinates = new Point[3]; Coordinates[0] = new Point(X1, Y1); Coordinates[1] = new Point(X2, Y2); Coordinates[2] = new Point(X3, Y3); } } class Quadrangle : Shape { public override void Draw() { Console.WriteLine("Четырехугольник:"); for (int i = 0; i < Coordinates.Length; i++) Console.WriteLine("({0},{1})", Coordinates[i].X, Coordinates[i].Y); } public Quadrangle(double X1, double Y1, double X2, double Y2, double X3, double Y3, double X4, double Y4) { Coordinates = new Point[4]; Coordinates[0] = new Point(X1, Y1); Coordinates[1] = new Point(X2, Y2); Coordinates[2] = new Point(X3, Y3); Coordinates[3] = new Point(X4, Y4); } } Лист. 9.14 Сначала в листинге мы определяем абстрактный класс фигура Shape. Класс состоит из одного поля Coordinates, содержащего координаты вершин фигуры на декартовой плоскости, и одного абстрактного метод Draw(), который в дальнейшем будут переопределять все потомки класса для вывода свих конкретных вершин. Далее создаются два потомка класса Shape: классы треугольник Triangle и квадрат Quadrangle. Оба этих класса обладают собственным конструктором, который инициализирует унаследованное ими поле Coordinates в соответствии с нуждами класса. Также эти классы переопределяют метод Draw() для вывода на консоль собственных вершин. Напишем теперь класс для тестирования созданной нами иерархии. Он должен будет создавать несколько объектов класса треугольник Triangle и квадрат Quadrangle, затем вызывать выводить их содержимое на экран. class Program { static void DrawShapes(Shape[] Shapes) { for (int i = 0; i < Shapes.Length; i++) Shapes[i].Draw(); } static void Main(string[] args) { Shape[] Shapes = new Shape[3]; Shapes[0] = new Triangle(11, 5, 7, 8, 2, 4); Shapes[1] = new Quadrangle(11, 5, 7, 8, 2, 4, 4, 8); Shapes[2] = new Triangle(133, 2, 7, 3, 2, 4); DrawShapes(Shapes); } } Лист. 9.15 Сначала в этом листинге мы создаем массив Shapes класса Shape, состоящий из трех элементов. Затем элементы массива инициализируются так, чтобы в нем хранились гетерогенные элементы. После инициализации массив передается методу DrawShapes(), вызывающему у каждого из его элементов метод Draw(). Вывод программы: Треугольник: (11,5) (7,8) (2,4) Четырехугольник: (11,5) (7,8) (2,4) (4,8) Треугольник: (133,2) (7,3) (2,4) Вывод 9.4 Download 2.46 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling