Наследование на примере классов Person, Student и Teacher

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск

Назначение

Использован в конспекте лекций по основам программирования в теме «наследование».

Описание

Представлена реализация следующих классов:

Наследование классов от Person

Тексты модулей

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.