Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Основи Програмування C_.doc
Скачиваний:
46
Добавлен:
18.12.2018
Размер:
1.44 Mб
Скачать

7. Абстрактні методи та класи.

Можлива ситуація, коли у базовому класі неможливо реалізувати деякий метод. Проте зрозуміло, що подібний метод зі своєю особливою функціональністю буде присутній у похідних класах. В такому випадку є сенс визначити «порожній» віртуальний метод у базовому класі (свого роду «заглушку»), визначивши його інтерфейс, а у похідних класах слушним чином визначити коди відповідних методів, що його заміщають. Засіб, який примушує всі похідні класи обов’язково замістити такий «невизначений» метод, полягає у використанні модифікатору abstract:

abstract <тип_результату> <ідентифікатор_методу> (<параметри_методу>);

Такий метод автоматично є віртуальним і його не треба додатково помічати службовим словом virtual.

Абстрактний метод, таким чином, взагалі не має тіла. Абстрактними можуть бути не лише методи, але й властивості. Клас, який містить принаймні один абстрактний член класу, теж має бути визначений як abstract, адже від нього не можна утворювати екземпляри – такі класи використовуються лише для спадкування. Класичним прикладом демонстрації абстрактного класу є клас геометричних форм – не існує загальної формули для визначення площі абстрактної геометричної фігури. Проте всім відомо як визначити площі, наприклад, квадрата або прямокутника чи кола. Розглянемо приклад, у якому визначається абстрактний клас Shape, що містить закрите текстове поле shapeType – тип фігури, та відкриту властивість ShapeType, яка реалізує доступ до нього. Ця властивість використовується у конструкторі класу. Властивість Area базового класу визначається як абстрактна. Крім того, вказується, що властивості, які будуть заміщати її у похідних класах, будуть мати лише аксесор get – властивість дозволяє лише читання. Зверніть увагу, що у базовому класі заміщається також метод ToString(), успадкований від класу System.Object. Тепер він буде виводити на екран тип фігури та її площу.

using System;

namespace AbstractClass

{ // абстрактний клас - геометрична форма

abstract class Shape

{

private string shapeType;

public string ShapeType

{ get { return shapeType; }

set { shapeType = value; }

}

public Shape(string s) // конструктор

{ ShapeType = s; } // працює set-аксесор властивості

// Площа Area є властивістю read-only

// буде потрібний лише get-аксесор

public abstract double Area // абстрактна властивість

{ get; }

// заміщаємо метод класу Object

public override string ToString()

{

return ShapeType + ": площа = " + String.Format("{0:F2}",

Area);}

}

class Square : Shape // похідний клас - квадрат

{

private double side;

// працює конструктор базового класу

public Square(double side_, string type) : base(type)

{ side = side_; }

// заміщаємо абстрактний метод

public override double Area

{ get // повертає площу квадрата із стороною side

{ return side * side;}

}

}

class Circle : Shape // похідний клас - коло

{

private double radius;

public Circle(double radius_, string type) // конструктор

: base(type) // працює конструктор базового класу

{ radius = radius_; }

// заміщаємо абстрактний метод

public override double Area

{

get // повертає площу кола радіуса radius

{ return radius * radius * Math.PI; }

}

}

class Rectangle : Shape // похідний клас - прямокутник

{

private double width;

private double height;

public Rectangle( // конструктор

double width_, double height_, string type)

: base(type) // працює конструктор базового класу

{ width = width_;

height = height_; }

// заміщаємо абстрактний метод

// повертає площу прямокутника ширини width і висоти height

public override double Area

{

get

{ return width * height;}

}

}

class Program

{

static void Main()

{ Shape[] shapes = { // масив геометричних форм

new Square(10, "Квадрат"),

new Circle(10, "Коло"),

new Rectangle( 10, 5, "Прямокутник")

};

Console.WriteLine("Масив геометричних фiгур");

foreach (Shape s in shapes)

// тут викликається заміщений метод ToString()

Console.WriteLine(s);

}

}

}

Результатом роботи цієї програми буде наступний вигляд екрану:

Масив геометричних фiгур

Квадрат: площа = 100

Коло: площа = 314,16

Прямокутник: площа = 50