На этом шаге мы рассмотрим простой пример использования абстрактных классов.
Для начала мы рассмотрим очень простой пример, в котором описывается абстрактный класс, а затем на основе этого класса создаются производные классы. Рассмотрим программу, представленную в примере ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr154_1 { // Абстрактный класс: abstract class Base { // Защищенное целочисленное поле: protected int num; // Конструктор: public Base(int n) { // Вызов метода: set(n); } // Абстрактные методы: public abstract void show(); public abstract void set(int n); public abstract int get(); } // Производный класс на основе абстрактного класса: class Alpha: Base { // Защищенное целочисленное поле: protected int val; // Конструктор: public Alpha(int n): base(n) { // Вызов метода: show(); } // Переопределение абстрактного метода: public override void show() { // Отображение сообщения: Console.WriteLine("Alpha: {0}, {1} и {2}", num, val, get()); } // Переопределение абстрактного метода: public override void set(int n) { // Присваивание значений полям: num = n; val = n % 10; } // Переопределение абстрактного метода: public override int get() { return num / 10; } } // Производный класс на основе абстрактного класса: class Bravo: Base { // Защищенное целочисленное поле: protected int val; // Конструктор: public Bravo(int n): base(n) { // Вызов метода: show(); } // Переопределение абстрактного метода: public override void show() { // Отображение сообщения: Console.WriteLine("Bravo: {0}, {1} и {2}", num, val, get()); } // Переопределение абстрактного метода: public override void set(int n) { // Присваивание значений полям: num = n; val = n % 100; } // Переопределение абстрактного метода: public override int get() { return num / 100; } } // Класс с главным методом: class Program { // Главный метод: static void Main() { // Объектная переменная абстрактного класса: Base obj; // Создание объектов производных классов: Alpha A = new Alpha(123); Bravo B = new Bravo(321); // Объектной переменной базового класса присваивается // ссылка на объект производного класса: obj = A; Console.WriteLine("После выполнения команды obj = A"); // Вызов методов через объектную переменную // базового класса: obj.set(456); obj.show(); // Объектной переменной базового класса присваивается // ссылка на объект производного класса: obj = B; Console.WriteLine("После выполнения команды obj = B"); // Вызов методов через объектную переменную // базового класса: obj.set(654); obj.show(); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы следующий:
Рис.1. Результат выполнения программы
В программе описан абстрактный класс Base. Он описан с ключевым словом abstract. В классе объявлены три абстрактных метода (все описаны с ключевым словом abstract):
На основе класса Base создается два класса: Alpha и Bravo. Эти классы очень похожи, но описываются по-разному. Начнем с общих моментов для обоих классов. И в классе Alpha, и в классе Bravo появляется дополнительное целочисленное поле val. В каждом из классов описан конструктор с целочисленным аргументом, который передается конструктору базового класса. В теле конструктора вызывается метод show(). Но описывается метод show() в каждом классе со своими особенностями. В классе Alpha при вызове метода show() отображаются название класса Alpha, значения полей num и val и результат вызова метода get(). Метод show() для класса Bravo описан так же, но название класса отображается другое. Метод get() в каждом классе также свой. В классе Alpha метод get() описан так, что результатом возвращается значение num/10. Это значение поля num, если в нем отбросить разряд единиц. В классе Bravo результатом метода get() является значение num/100, которое получается отбрасыванием разрядов единиц и десятков в значении поля num.
Метод set() в классе Alpha переопределен таким образом, что при целочисленном аргументе n выполняются команды
num = n;
val = n % 10; .
В классе Bravo метод set() описан похожим образом, но полю val значение присваивается командой
val = n % 100;
В главном методе программы мы командой
Base obj;
Alpha A = new Alpha(123);
Bravo B = new Bravo(321);
После выполнения команды
obj = A;
obj.set(456);
obj.show();
Затем выполняется команда
obj = B; ,
obj.set(654);
obj.show();
На следующем шаге мы закончим изучение этого вопроса.