Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть — различия между версиями
Juliet (обсуждение | вклад) (→Наследование) |
Juliet (обсуждение | вклад) (→Наследование на примере Student - SeniorStudent) |
||
Строка 66: | Строка 66: | ||
=== Наследование на примере Student - SeniorStudent === | === Наследование на примере Student - SeniorStudent === | ||
+ | Про переменную <tt>Self</tt> см. [[Основы программирования — второй семестр 08-09; Михалкович С.С.; V часть#Переменная self | здесь]]. | ||
+ | |||
<xh4> Базовый класс Student </xh4> | <xh4> Базовый класс Student </xh4> | ||
+ | <source lang="Delphi"> | ||
+ | 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; | ||
+ | </source> |
Версия 10:41, 2 мая 2009
Наследование
Введение
Наследование в программировании возникло как ответ на реальные отношения наследования классов в реальном мире и прикладных задачах.
————————————
Ввиду увеличения сложности задач в программировании, акцент переместился от алгоритмов к объектам, содержащим алгоритмы в качестве методов.
При этом, понятие главного алгоритма также потеряло свою важность. В больших проектах нет главного алгоритма или он тривиален, но есть большое число взаимосвязанных задач.
Пример. Главный алгоритм работы операционной системы.
* начальная инициализация * цикл обработки сообщений если сообщение пришло то обработать сообщение до сообщения «Конец» * заключительные действия
Как видим, этот алгоритм тривиален и ничего не говорит о том, как работает ОС.
————————————
Поскольку главный алгоритм сложной системы не существует или тривиален, то для программирования работы этой сложной системы мы:
- выявляем классы объектов, присутствующих в этой системе
- их свойства и методы
- выявляем то общее, что есть в различных классах
- выявляем различные взаимозависимости между классами и взаимодействие между объектами этих классов
Примеры взаимозависимостей и взаимодействия.
- класс содержит в качестве поля объект другого класса
- в методе класса параметром является объект другого класса
- метод класса вызывает статический метод другого класса
и т.д.
Замечание.
Взаимодействие классов устанавливается на этапе написания текста программы,
а взаимодействие конкретных объектов устанавливается на этапе выполнения программы
К отношениям между классами относится также то, при котором
один из классов является разновидностью другого.
Пример.
Эти классы (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;