Частные типы видны всем?

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

Я всегда думал, что их видимость ограничена классом, если тип не указан с именем типа типа, как TMyClass.TMytype.Value;

Я делаю что-то действительно неправильное здесь, как структуры, такие как:

unit MyTest;

interface

type TMyTest  = class
    constructor Create;

    strict private
        type TMyType = ( NUL, SLEEP );

end;

implementation

// ...

вызывает конфликты в других единицах, которые используют этот (MyTest) блок.

Если устройство имеет Sleep (100); вызов, он будет конфликтовать с TMyTest.TMyType.SLEEP и предотвращением конфликтов, поэтому я инкапсулировал SLEEP внутри класса и TMyType в первую очередь.

Любое предложение об обходных решениях?

Ответы

Ответ 1

Это на самом деле по дизайну. Значения перечисления имеют единицу или глобальную область. Они не являются частными, так как они не являются частью класса. Они охвачены глобальным уровнем.

Вы можете упорядочить значения enum для локальной области, включив директиву scoped enums:

{$SCOPEDENUMS ON}

Директива $SCOPEDENUMS разрешает или запрещает использование регистровых перечислений в коде Delphi. Более конкретно, $SCOPEDENUMS влияет только на определения новых перечислений и только контролирует добавление символов значения перечисления в глобальную область.

В состоянии {$SCOPEDENUMS ON} перечисления имеют область действия, а значения перечисления не добавляются в глобальную область. Чтобы указать член облачного перечисления, вы должны указать тип перечисления.