У вас есть две проблемы с круговыми ссылками.Во-первых, вы объявляете два блока, каждый из которых ссылается на другой в разделе интерфейса.Это может быть решено различными способами.На данный момент Пока я собираюсь игнорировать эту проблему и сосредоточиться на другой круговой ссылочной проблеме.Для этого я предполагаю, что весь код отображается в одном и том же блоке.
Более насущная проблема с циклической ссылкой состоит в том, что TIns
относится к TExtract
и наоборот.Для того, чтобы разорвать эту конкретную цикличность, вам необходимо ввести прямую ссылку, как это обычно делается с классами.Но оказывается, что прямые ссылки не могут быть сделаны для record
типов.
Хотя прямые ссылки возможны для типов классов, между типами классов и типами записей есть принципиальное различие.Типы записей являются типами значений, а типы классов являются ссылочными типами.Текущая реализация компилятора Delphi не поддерживает прямые ссылки для типов значений.
Решение вашей проблемы состоит в том, чтобы переместить операторы, которые ссылаются на оба типа, в ту запись, которая объявлена последней.Например:
TIns = record
private type
TInsArray = array [1..90] of Boolean;
var
FInsArray: TInsArray;
end;
TExtract = record
private type
TExtractEnum = 1 .. 90;
var
FExtractEnum: TExtractEnum;
public
class operator Implicit(const Value: TExtract): TIns;
class operator Implicit(const Value: TIns): TExtract;
class operator Implicit(const Value: Integer): TExtract;
class operator Implicit(const Value: TExtract): Integer;
class operator In(A: TExtract; B: TIns) : Boolean;
end;
Если вы хотите сохранить две отдельные единицы, сделайте это следующим образом:
- Поместите
TIns
в единицу _TIns
. - Do not use
_TExtract
from _TIns
. - Введите
TExtract
в устройстве _TExtract
. - Используйте
_TIns
в разделе интерфейса _TExtract
.
Вот так:
unit _TIns;
interface
type
TIns = record
private type
TInsArray = array [1..90] of Boolean;
var
FInsArray: TInsArray;
end;
implementation
end.
unit _TExtract;
interface
uses
_TIns;
type
TExtract = record
private type
TExtractEnum = 1 .. 90;
var
FExtractEnum: TExtractEnum;
public
class operator Implicit(const Value: TExtract): TIns;
class operator Implicit(const Value: TIns): TExtract;
class operator Implicit(const Value: Integer): TExtract;
class operator Implicit(const Value: TExtract): Integer;
class operator In(A: TExtract; B: TIns) : Boolean;
end;
implementation
// Code
end.