Während der Entwicklung des Programms habe ich zufällig bemerkt, dass alle Typen, die innerhalb einer Klasse deklariert sind, globale Sichtbarkeit haben.Private Typen sind für alle sichtbar?
Ich dachte immer, dass ihre Sichtbarkeit auf die Klasse beschränkt ist, es sei denn, der Typ wird mit einem Klassennamen wie TMyClass.TMytype.Value bezeichnet;
Bin ich etwas wirklich falsch hier, wie Strukturen wie folgt:
unit MyTest;
interface
type TMyTest = class
constructor Create;
strict private
type TMyType = (NUL, SLEEP);
end;
implementation
// ...
verursacht Konflikte in anderen Einheiten, die diese (MyTest) Gerät verwendet.
Wenn Gerät hat Schlaf (100); Call, es wird in Konflikt mit TMyTest.TMyType.SLEEP und die Vermeidung von Konflikten war der Grund, warum ich SLEEP innerhalb der Klasse und TMyType an erster Stelle gekapselt.
Irgendwelche Vorschläge für eine Problemumgehung?
Es ist in der Tat überraschend, aber wie David in seiner Antwort erwähnt: es ist absichtlich für enum Werte. FYI: Scope-Konflikt von Enum-Werten ist seit vielen Jahren ein Problem in Delphi. Daher schreiben die Entwickler üblicherweise Enum-Werte vor. Z.B. 'TMyType = (mtNUL, mtSLEEP);' (Etwas, das in Betracht gezogen werden sollte, um Konsistenz des Codestils zu gewährleisten.) Eine weitere Workaround, die für ihre allgemeinere Anwendbarkeit erwähnenswert ist: Wenn Bezeichner in Konflikt stehen, können Sie den gewünschten Einheitennamen voranstellen, um den Konflikt zu lösen. Z.B. 'Windows.Sleep' –