2015-11-13 10 views
15

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?

+1

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' –

Antwort

14

Dies ist eigentlich von Entwurf. Ihre Enum-Werte haben Einheit oder globalen Gültigkeitsbereich. Sie sind nicht privat, da sie nicht Teil der Klasse sind. Sie sind auf globaler Ebene begrenzt.

Sie arrangieren für die ENUM-Werte, indem die scoped enums Richtlinie lokalen Bereich haben:

{$SCOPEDENUMS ON} 

Die $SCOPEDENUMS Richtlinie aktiviert oder deaktiviert die Verwendung von scoped Aufzählungen in Delphi-Code. Genauer gesagt wirkt sich $SCOPEDENUMS nur auf Definitionen neuer Enumerationen aus und steuert nur das Hinzufügen der Wertesymbole der Enumeration zum globalen Gültigkeitsbereich.

Im Status {$SCOPEDENUMS ON} sind Aufzählungen im Gültigkeitsbereich und dem globalen Gültigkeitsbereich werden keine Aufzählungswerte hinzugefügt. Um ein Mitglied einer Bereichsaufzählung anzugeben, müssen Sie den Typ der Aufzählung einschließen.

+0

Vielleicht sollte es in den ** Wert ** Symbolen ** der Dokumenten * Enumeration gedruckt werden. Der Typ selbst ist streng privat, aber nicht die Werte. Dies ist auf den ersten Blick nicht klar, mehr auf der zweiten oder dritten: o) –