Delphi. Урок 24. Приведение типов 1.2

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

Явное приведение

Мы уже не раз сталкивались с ситуациями, когда необходимо, например, получить строковое представление числа, или число из его строкового представления. Далеко за примерами таких ситуаций идти не придется, т.к. нам потребуется реализовать соответствующие преобразования даже при попытке отобразить число на экране, например в виде сообщения. Кроме того, ранее мы уже упоминали о существовании таких полезных функций, как StrToInt, IntToStr и т.п. Еще раз вспомним, как они работают:

 
1

2

3

4

5

6

7

8

9

10

11

12
 
var 

  a: integer;

  b: string;

begin

  a := 123;

  b := IntToStr(a);



  ...



  b := '234';

  a := StrToInt(b);

end;

Также существуют функции FloatToStr, StrToFloat, которые выполняют аналогичные действия, но только между строковыми и вещественными типами данных.
Т.е. большинство явных приведений в Delphi выполняется при помощи специальных функций. В число таких функций войдут и DateToStr, DateTimeToStr и многие другие. 
Некоторые явные преобразования можно реализовывать и следующим образом:

1

2

3

4

5

6

7
 
var 

  c: char;

  b: byte;

begin

  b := 69;

  c := Char(b); // В результате переменная "c" будет содержать букву "E"

end;

В таком случае произойдет преобразование числа в символ по таблице ASCII. Тоже самое можно проделать и наоборот:

1

2

3

4

5

6

7
 
var 

  c: char;

  b: byte;

begin

  c := 'E';

  b := Byte(c); // b = 69

end;
Неявное приведение

Неявными считаются те преобразования типов переменных, которые происходят без нашего непосредственного контроля. Обычно они происходят посредством операций присвоения или сравнения. Например:

 
1

2

3

4

5

6

7

8
 
var

  d: double;

  a: integer;

begin

  a := 100;

  d := a;

  if a = d then ShowMessage('a = d');

end;

Но важно учитывать те случаи, когда присваиваемое значение может принципиально не соответствовать переменной, в которую происходит присвоение. Примером таких случаев является попытка присвоить целочисленной переменной вещественное значение (или математическое выражение, которое сводится к вещественному значению), или попытка выйти за границы допустимых значений у какого-либо типа. Последняя ошибка в некоторых случаях может отлавливаться компилятором еще до компиляции («Constant expression violates subrange bounds»), но чаще всего такую ошибку допускают именно в run-time, т.е. во время работы программы, поэтому стоит с осторожностью применять неявные приведения.

Приведения объектов

Рассмотрим два класса, один из которых будет являться родительским для другого:

1

2

3

4

5

6

7

8

9

10

11
 
type



TParent = class

public

  procedure ParentMethod;

end;



TChild = class(TParent)

public

  procedure ChildMethod;

end;

В случае с экземплярами классов, возможны привидения объекта дочернего класса к родительскому и наоборот. Рассмотрим эти приведения подробнее:

Восходящие приведения

Такие приведения позволяют представить объект дочернего класса в виде родительского. На самом деле никакого преобразования в данном случае производить не требуется, т.к. возможность обращаться к экземпляру дочернего класса, как к экземпляру родительского класса, уже автоматически предусмотрена в Delphi. Не нужно ничего делать — мы всегда можем обратиться к методам, полям (и т.п.) родительского класса.

 
1

2

3

4

5

6

7

8

9
 
:= TParent.Create;

:= TChild.Create;

(as TParent).ParentMethod; 

// Приведения экземпляров класса к другому классу 

// (к родительскому, а далее и к дочернему) реализуются 

// таким образом при помощи оператора "as"

// НО! Как мы уже сказали, в таком ручном приведении 

// нет никакого смысла, и мы можем сделать это так:

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