Наследование на примере классов Person, Student и Teacher
Материал из Вики ИТ мехмата ЮФУ
Назначение
Использован в конспекте лекций по основам программирования в теме «наследование».
Описание
Представлена реализация следующих классов:
Тексты модулей
PersonUnit
unit PersonUnit;
interface
uses System;
const
/// Минимальный возможный возраст
MIN_AGE = 1;
/// Максимальный возможный возраст
MAX_AGE = 120;
// --------------------------------------------- Person -------------------------------------------
type
/// Персона
Person = class
private
/// Имя
fName: string;
/// Возраст
fAge: integer;
/// Устанавливает имя равным name, если оно не пусто
procedure SetName(name: string);
/// Устанавливает возраст равным age, если он положителен
/// и не превышает максимально возможного (MAX_AGE)
procedure SetAge(age: integer);
public
/// <summary>
/// Создает новую персону
/// </summary>
/// <param name="Name">Имя (пустое недопустимо)</param>
/// <param name="Age">Возраст (отрицательный недопустим)</param>
constructor Create(Name: string; Age: integer);
/// Имя
property Name: string read fName write SetName;
/// Возраст
property Age: integer read fAge write SetAge;
/// Выводит на консоль информацию о персоне
procedure Print;
end;
implementation
// --------------------------------------------- Person -------------------------------------------
{Устанавливает имя равным name, если оно не пусто}
procedure Person.SetName(name: string);
begin
if name <> '' then
fName := name
else
raise new Exception(
'Попытка задать персоне пустое имя.');
end;
{Устанавливает возраст равным age, если он положителен
и не превышает максимально возможного (MAX_AGE)}
procedure Person.SetAge(age: integer);
begin
if age > 0 then
fAge := age
else
raise new Exception(
'Выход за границы диапазона допустимого возраста [' +
MIN_AGE.ToString + '..' + MAX_AGE.ToString + '].');
end;
constructor Person.Create(Name: string; Age: integer);
begin
SetName(Name);
SetAge(Age);
end;
procedure Person.Print;
begin
WriteFormat(
'Имя: {0} Возраст: {1} ',
fName, fAge);
end;
end.
StudentUnit
unit StudentUnit;
interface
uses System, PersonUnit;
const
/// Первый курс
FIRST_COURSE = 1;
/// Последний курс для студентов младших курсов
LAST_UNDERGRADUATE_COURSE = 4;
// -------------------------------------------- Student -------------------------------------------
type
/// Студент
Student = class (Person)
private
///Курс
fCourse: integer;
///Группа
fGroup: integer;
/// Устанавливает номер группы равным group,
/// если он неотрицателен
procedure SetGroup(group: integer);
public
/// <summary>
/// Создает нового студента
/// </summary>
/// <param name="Name">Имя (пустое недопустимо)</param>
/// <param name="Age">Возраст (отрицательный недопустим)</param>
/// <param name="Course">Курс (отрицательный или больший LAST_UNDERGRADUATE_COURSE недопустим)</param>
/// <param name="Group">Группа (отрицательная недопустима)</param>
constructor Create(Name: string; Age, Course, Group: integer);
/// Переводит студента на следующий курс, если он меньше LAST_UNDERGRADUATE_COURSE
procedure NextCourse;
/// Курс — доступ только на чтение
property Course: integer read fCourse;
/// Группа
property Group: integer read fGroup write SetGroup;
/// Выводит на консоль информацию о студенте
procedure Print;
end;
implementation
// -------------------------------------------- Student -------------------------------------------
{Устанавливает номер группы равным Group, если он неотрицателен}
procedure Student.SetGroup(group: integer);
begin
if group > 0 then
fGroup := group
else
raise new Exception(
'Попытка присвоить номеру группы отрицательное значение.');
end;
constructor Student.Create(Name: string; Age, Course, Group: integer);
begin
inherited Create(name, age);
SetGroup(Group);
if (Course >= FIRST_COURSE) and (Course <= LAST_UNDERGRADUATE_COURSE) then
fCourse := Course
else
raise new Exception(
'Выход за границы диапазона допустимых курсов [' +
FIRST_COURSE.ToString + '..' + LAST_UNDERGRADUATE_COURSE.ToString + ']!');
end;
{Переводит студента на следующий курс, если он меньше LAST_UNDERGRADUATE_COURSE}
procedure Student.NextCourse;
begin
if fCourse < LAST_UNDERGRADUATE_COURSE then
fCourse += 1
else
raise new Exception(
'Выход за границы диапазона допустимых курсов [' +
FIRST_COURSE.ToString + '..' + LAST_UNDERGRADUATE_COURSE.ToString + ']!');
end;
procedure Student.Print;
begin
inherited Print;
WriteFormat(
'Курс: {0} Группа: {1} ',
fCourse, fGroup);
end;
end.
TeacherUnit
unit TeacherUnit;
interface
uses System, PersonUnit, System.Collections.Generic;
// -------------------------------------------- Teacher -------------------------------------------
type
/// Преподаватель
Teacher = class (Person)
private
/// Список читаемых курсов
fDisciplines: List<string>;
public
/// <summary>
/// Создает нового преподавателя
/// </summary>
/// <param name="Name">Имя (пустое недопустимо)</param>
/// <param name="Age">Возраст (отрицательный недопустим)</param>
/// <param name="Disciplines">Список читаемых курсов (пустые названия
/// курсов недопустимы)</param>
constructor Create(Name: string; Age: integer; Disciplines: List<string>);
/// Добавляет новый курс в список читемых курсов
procedure AddDiscipline(discipline: string);
/// Удаляет курс из списка читемых курсов
procedure RemoveDiscipline(discipline: string);
///Список читаемых курсов - доступ только на чтение
property Disciplines : List <string> read fdisciplines;
/// Выводит на консоль информацию о преподавателе
procedure Print;
end;
implementation
// -------------------------------------------- Teacher -------------------------------------------
constructor Teacher.Create(Name: string; Age: integer; Disciplines: List <string>);
begin
inherited Create(Name, Age);
foreach d: string in Disciplines do
if d <> '' then
fDisciplines.Add(d)
else
raise new Exception(
'Попытка добавить в список читаемых курсов дисциплину с путым именем.');
end;
procedure Teacher.AddDiscipline(discipline: string);
begin
if discipline <> '' then
fDisciplines.Add(discipline)
else
raise new Exception(
'Попытка добавить в список читаемых курсов дисциплину с путым именем.');
end;
procedure Teacher.RemoveDiscipline(discipline: string);
begin
var index_of_discipline := fDisciplines.IndexOf(discipline);
if index_of_discipline <> 0 then
fDisciplines.RemoveAt(index_of_discipline)
else
raise new Exception(
'Данная дисциплина ("' + discipline +
'") отсутствует в списке читаемых курсов.');
end;
procedure Teacher.Print;
begin
inherited Print;
write('Список читаемых курсов:');
foreach d : string in fDisciplines do
write(' ', d);
end;
end.