Delphi. Урок 19. Поля-объекты внутри классов 2.2

Присваивать этим полям значения можно достаточно легко, например так:

 
1

2

3

4

5

6

7
 
var Teacher1: TTeacher;

    Student1: TStudent; 

begin

  Teacher1 := TTeacher.Create('Tyapkin Vladimir Alexeevich');

  Student1 :- TStudent.Create('Pupkin Vasilyi Vasilievich');

  Student1.MathTeacher := Teacher1;

end;

[important]При присвоении одному объекту А значения другого объекта B, для A присваивается лишьуказатель на объект B. Это означает, что и A и B будут ссылаться на один и тот же объект, на одну и ту же область оперативной памяти. Например, при изменении впоследствии объекта B (или А), изменится и значение, возвращаемое объектом А (или B), т.к. они являются одним и тем же объектом. Эта особенность очень широко используется, т.к. позволяет легко создавать различные взаимосвязи между классами. В данном случае все экземпляры классов можно считать указателями, если у одного объекта имеется несколько экземпляров, то они не копируют данные, они указывают на одни и те же данные.[/important]
Нельзя пройти мимо очень полезной функции Assigned, которая позволяет проверить, был ли присвоен какой-либо объект данному полю:

 
1

2

3

4

5

6

7

8

9

10

11

12

13
 
var Teacher1: TTeacher;

    Student1: TStudent; 

begin

  Teacher1 := TTeacher.Create('Tyapkin Vladimir Alexeevich');

  Student1 :- TStudent.Create('Pupkin Vasilyi Vasilievich');



  ...



  if not Assigned(Student1.MathTeacher) then 

    Student1.MathTeacher := Teacher1 

  else

    ShowMessage('Студенту '+Student1.FullName + ' уже присвоен учитель математики '+Student1.MathTeacher);

end;

Ну и рассмотрим еще один несложный пример, в котором мы уже будем работать с целым массивом этих самых указателей на объекты. Для этого изучим класс TSchool. В нем описаны два массива: учителя и ученики. Заполнять их можно также просто:

 
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
 
var i, n, j: integer;

    school: TSchool;

begin

  school := TSchool.Create(123);



  n := 1;

  for i := 1 to 10 do begin

    school.Teachers[i] := TTeacher.Create('Teacher ' + IntToStr(i));

    for j := 1 to 10 do begin

      school.Students[n] := TStudent.Create('Student '+ IntToStr(n));

      school.Students[n].MathTeacher := school.Teachers[i];

      inc(n); 

    end;

  end;

end;

В данном примере мы создаем 10 учителей и 100 учеников. Каждому ученику присваиваем в цикле учителя математики. Несложно заметить, что присвоение здесь выглядит также как и в случае с обыкновенными переменными, но нужно помнить, что присваиваются не значения самих объектов, а присваиваются указатели на объект.
Чтобы очистить поле или переменную-экземпляр, в котором ранее содержался объект, достаточно ему присвоить значение nil:

1

2

3

4

5

6
 
var school, schoollink: TSchool;

begin

  school := TSchool.Create;

  schoollink := school; // Создаем еще один указатель на объект

  schoollink := nil; // Schoollink больше не является указателем на school

end;

[warning]Если вы обнулите (присвоите nil) всем указателем на один объект, то вы потеряете возможность обращаться к содержимому этого экземпляра. А как следствие это будет являться причиной утечки памяти, т.к. объект теперь никак не сможет быть освобожден, если ранее не был вызван деструктор.[/warning]
Ну и, конечно же, мы всегда можем обращаться к полям-объектам внутри методов текущего класса, а соответственно реализовывать необходимые аналогичные присвоения и многое другое.

Категория: delphi 7 | Добавил: ghost_mod (14.09.2016)
Просмотров: 368 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email:
Подписка:1
Код *: