2015-11-13 44 views
15

Durante lo sviluppo del programma ho notato accidentalmente che tutti i tipi dichiarati all'interno di una classe hanno visibilità globale.I tipi privati ​​sono visibili a tutti?

Ho sempre pensato che la loro visibilità è limitata alla classe a meno che il tipo non sia riferito al nome del tipo di classe come TMyClass.TMytype.Value;

sto facendo qualcosa di veramente sbagliato qui, come strutture come segue:

unit MyTest; 

interface 

type TMyTest = class 
    constructor Create; 

    strict private 
     type TMyType = (NUL, SLEEP); 

end; 

implementation 

// ... 

provoca conflitti in altre unità che utilizza questa unità (MyTest).

Se l'unità ha Sleep (100); chiamata, sarà in conflitto con TMyTest.TMyType.SLEEP e la prevenzione dei conflitti è stato il motivo per cui ho incapsulato SLEEP all'interno della classe e TMyType al primo posto.

Qualche suggerimento per soluzioni alternative?

+1

È davvero sorprendente, ma come David cita nella sua risposta: è intenzionale per i valori enum. A proposito: il conflitto di portata dei valori enum è stato un problema in Delphi per molti anni. Quindi, per convenzione, gli sviluppatori di solito prefisso valori enum. Per esempio. 'TMyType = (mtNUL, mtSLEEP);' (Qualcosa che vale la pena considerare per garantire la coerenza dello stile del codice.) Un'altra soluzione da menzionare per la sua applicabilità più generale: dove gli identificatori sono in conflitto, è possibile aggiungere il nome dell'unità desiderato per risolvere il conflitto. Per esempio. 'Windows.Sleep' –

risposta

14

Questo è in realtà di progettazione. I tuoi valori enum hanno una portata unitaria o globale. Non sono privati ​​poiché non fanno parte della classe. Sono previsti a livello globale.

È possibile organizzare i valori enum di avere ambito locale includendo la direttiva scoped enums:

{$SCOPEDENUMS ON} 

La direttiva $SCOPEDENUMS abilita o disabilita l'utilizzo di enumerazioni con ambito nel codice Delphi. Più specificamente, $SCOPEDENUMS riguarda solo le definizioni di nuove enumerazioni e controlla solo l'aggiunta dei simboli di valore dell'enumerazione all'ambito globale.

Nello stato {$SCOPEDENUMS ON}, le enumerazioni sono con ambito ei valori enum non vengono aggiunti all'ambito globale. Per specificare un membro di un enun ambito, è necessario includere il tipo di enum.

+0

Forse dovrebbe essere stampato nei simboli * del valore ** del simbolo * dell'enumerazione *. Il tipo stesso è 'strict private' ma non i valori. Questo non è chiaro a prima vista, più su seconda o terza: o) –