Основы программирования — второй семестр 08-09; Михалкович С.С.; VI часть

Материал из Вики ИТ мехмата ЮФУ
Версия от 10:41, 2 мая 2009; Juliet (обсуждение | вклад) (Наследование на примере Student - SeniorStudent)

Перейти к: навигация, поиск

Наследование

Введение

Иерархическая классификация животных в биологии

Наследование в программировании возникло как ответ на реальные отношения наследования классов в реальном мире и прикладных задачах.

————————————
Ввиду увеличения сложности задач в программировании, акцент переместился от алгоритмов к объектам, содержащим алгоритмы в качестве методов.
При этом, понятие главного алгоритма также потеряло свою важность. В больших проектах нет главного алгоритма или он тривиален, но есть большое число взаимосвязанных задач.

Пример. Главный алгоритм работы операционной системы.

* начальная инициализация
* цикл обработки сообщений
    если сообщение пришло то 
      обработать сообщение 
    до сообщения «Конец»
* заключительные действия

Как видим, этот алгоритм тривиален и ничего не говорит о том, как работает ОС.
————————————

Поскольку главный алгоритм сложной системы не существует или тривиален, то для программирования работы этой сложной системы мы:

  • выявляем классы объектов, присутствующих в этой системе
  • их свойства и методы
  • выявляем то общее, что есть в различных классах
  • выявляем различные взаимозависимости между классами и взаимодействие между объектами этих классов

Примеры взаимозависимостей и взаимодействия.

  1. класс содержит в качестве поля объект другого класса
  2. в методе класса параметром является объект другого класса
  3. метод класса вызывает статический метод другого класса

и т.д.

Замечание.
Взаимодействие классов устанавливается на этапе написания текста программы,
а взаимодействие конкретных объектов устанавливается на этапе выполнения программы

К отношениям между классами относится также то, при котором
один из классов является разновидностью другого.
Пример.

Пример наследования

Эти классы (StudentSeniorStudent) называют:

  • базовыйпроизводный
  • предокпотомок
  • надклассподкласс

Все производные классы наследуют от базового:

  • поля
  • методы
  • свойства

а также могут добавлять новые:

  • поля
  • свойства
  • методы

и переопределять (замещать)

  • некоторые методы базового класса


Каковы цели наследования?

  1. повторное использование кода
  2. обеспечение вариабельности и изменчивости кода

Наследование — это расширение или сужение?
Наследование — это расширение интерфейса класса, но сужение количества объектов (представителей) класса.

Наследование на примере 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;