Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть
Наследование
Введение
Наследование в программировании возникло как ответ на реальные отношения наследования классов в реальном мире и прикладных задачах.
————————————
Ввиду увеличения сложности задач в программировании, акцент переместился от алгоритмов к объектам, содержащим алгоритмы в качестве методов.
При этом, понятие главного алгоритма также потеряло свою важность. В больших проектах нет главного алгоритма или он тривиален, но есть большое число взаимосвязанных задач.
Пример. Главный алгоритм работы операционной системы.
* начальная инициализация * цикл обработки сообщений если сообщение пришло то обработать сообщение до сообщения «Конец» * заключительные действия
Как видим, этот алгоритм тривиален и ничего не говорит о том, как работает ОС.
————————————
Поскольку главный алгоритм сложной системы не существует или тривиален, то для программирования работы этой сложной системы мы:
- выявляем классы объектов, присутствующих в этой системе
- их свойства и методы
- выявляем то общее, что есть в различных классах
- выявляем различные взаимозависимости между классами и взаимодействие между объектами этих классов
Примеры взаимозависимостей и взаимодействия.
- класс содержит в качестве поля объект другого класса
- в методе класса параметром является объект другого класса
- метод класса вызывает статический метод другого класса
и т.д.
Замечание.
Взаимодействие классов устанавливается на этапе написания текста программы,
а взаимодействие конкретных объектов устанавливается на этапе выполнения программы
К отношениям между классами относится также то, при котором
один из классов является разновидностью другого.
Пример.
Эти классы (Student — SeniorStudent) называют:
- базовый — производный
- предок — потомок
- надкласс — подкласс
Все производные классы наследуют от базового:
- поля
- методы
- свойства
а также могут добавлять новые:
- поля
- свойства
- методы
и переопределять (замещать)
- некоторые методы базового класса
Каковы цели наследования?
- повторное использование кода
- обеспечение вариабельности и изменчивости кода
Наследование — это расширение или сужение?
Наследование — это расширение интерфейса класса, но сужение количества объектов (представителей) класса.
Наследование на примере Student - SeniorStudent
Про переменную Self см. здесь.
<xh4> Базовый класс Student </xh4>
interface
uses System;
const
/// Минимальный допустимый возраст студента
MIN_AGE = 1;
/// Максимальный допустимый возраст студента
MAX_AGE = 120;
/// Минимальный возможный курс
MIN_COURSE = 1;
/// Максимальный возможный курс
MAX_COURSE = 4;
type
/// Студент
Student = class
private
fName: string;
fAge, fCourse, fGroup: integer;
procedure SetName(Name: string);
procedure SetAge(Age: integer);
procedure SetCourse(Course: integer);
procedure SetGroup(Group: integer);
procedure IncAge;
public
/// Имя — только на чтение
property Name: string read fName;
/// Возраст — только на чтение
property Age: integer read fAge;
/// Курс — только на чтение
property Course: integer read fCourse;
/// Группа — только на чтение
property Group: integer read fGroup;
constructor Create(Name: string; Age, Course, Group: integer);
procedure NextCourse;
procedure Print;
procedure Println;
end;
implementation
procedure Student.SetName(Name: string);
begin
if Name <> '' then
fName := Name
else
raise new Exception(
'Попытка присвоить студенту пустое имя!');
end;
procedure Student.SetAge(Age: integer);
begin
if (Age >= MIN_AGE) and (Age <= MAX_AGE) then
fAge := Age
else
raise new Exception(
'Выход за границы диапазона допустимого возраста [' +
MIN_AGE.ToString + '..' + MAX_AGE.ToString + ']!');
end;
procedure Student.SetCourse(Course: integer);
begin
if (Course >= MIN_COURSE) and (Course <= MAX_COURSE) then
fCourse := Course
else
raise new Exception(
'Выход за границы диапазона допустимых курсов [' +
MIN_COURSE.ToString + '..' + MAX_COURSE.ToString + ']!');
end;
procedure Student.SetGroup(Group: integer);
begin
if (Group > 0) then
fGroup := Group
else
raise new Exception(
'Попытка присвоить гурппе отрицательный номер!');
end;
procedure Student.IncAge;
begin
if fAge < MAX_AGE then
fAge += 1
else
raise new Exception(
'Выход за границы диапазона допустимого возраста [' +
MIN_AGE.ToString + '..' + MAX_AGE.ToString + ']!');
end;
constructor Student.Create(Name: string; Age, Course, Group: integer);
begin
SetName(Name);
SetAge(Age);
SetCourse(Course);
SetGroup(Group);
end;
procedure Student.NextCourse;
begin
if fCourse < MAX_COURSE then
begin
fCourse += 1;
IncAge;
end
else
raise new Exception(
'Выход за границы диапазона допустимых курсов [' +
MIN_COURSE.ToString + '..' + MAX_COURSE.ToString + ']!');
end;
procedure Student.Print;
begin
WriteFormat(
'Имя: {0} Возраст: {1} Курс: {2} Группа: {3}',
fName, fAge, fCourse, fGroup);
end;
procedure Student.Println;
begin
Print;
writeln();
end;