2015-11-13 11 views
15

कार्यक्रम के विकास के दौरान मैंने गलती से देखा कि कक्षाओं के भीतर घोषित सभी प्रकारों की वैश्विक दृश्यता है।निजी प्रकार सभी के लिए दृश्यमान हैं?

मैंने हमेशा सोचा है कि उनकी दृश्यता कक्षा तक ही सीमित है जब तक कि टाइप प्रकार नाम से TMyClass.TMytype.Value;

हूँ मैं निम्नलिखित की तरह वास्तव में गलत यहाँ कुछ कर रही है, संरचनाओं के रूप में:

unit MyTest; 

interface 

type TMyTest = class 
    constructor Create; 

    strict private 
     type TMyType = (NUL, SLEEP); 

end; 

implementation 

// ... 

इस (MyTest) इकाई का उपयोग करता है अन्य इकाइयों में संघर्ष का कारण बनता है।

यदि इकाई नींद (100) है; कॉल करें, यह TMyTest.TMyType.SLEEP के साथ संघर्ष करेगा और संघर्षों की रोकथाम इसलिए मैंने पहली जगह कक्षा और टीएमटी टाइप के अंदर एसएलईईपी को समाहित किया था।

कामकाज के लिए कोई सुझाव?

+1

यह वास्तव में आश्चर्यजनक है लेकिन जैसा कि डेविड ने अपने उत्तर में उल्लेख किया है: यह enum मूल्यों के लिए जानबूझकर है। एफवाईआई: कई वर्षों तक डेल्फी में enum मूल्यों का दायरा संघर्ष एक मुद्दा रहा है। तो सम्मेलन से, डेवलपर्स आम तौर पर enum मान prefix। जैसे 'TMyType = (mtNUL, mtSLEEP);' (कोड शैली स्थिरता सुनिश्चित करने के लिए विचार करने योग्य कुछ भी।) एक और कामकाज इसके सामान्य प्रयोज्यता के लिए उल्लेखनीय है: जहां पहचानकर्ता संघर्ष करते हैं, आप संघर्ष को हल करने के लिए इच्छित इकाई नाम को उपसर्ग कर सकते हैं। जैसे 'विंडोज़ स्लीप' –

उत्तर

14

यह वास्तव में डिज़ाइन द्वारा है। आपके enum मानों में इकाई या वैश्विक दायरा है। वे निजी नहीं हैं क्योंकि वे कक्षा का हिस्सा नहीं हैं। वे वैश्विक स्तर पर scoped हैं।

enum मूल्यों scoped enums निर्देश शामिल करके स्थानीय गुंजाइश है करने के लिए के लिए आप की व्यवस्था कर सकते हैं:

{$SCOPEDENUMS ON} 

$SCOPEDENUMS निर्देश सक्षम बनाता है या डेल्फी कोड में scoped enumerations के उपयोग अक्षम करता है। अधिक विशेष रूप से, $SCOPEDENUMS नई गणनाओं की केवल परिभाषाओं को प्रभावित करता है, और केवल वैश्विक दायरे में गणना के मूल्य प्रतीकों को जोड़ने के नियंत्रण को नियंत्रित करता है।

{$SCOPEDENUMS ON} राज्य में, गणनाएं स्कॉप्ड की गई हैं, और वैश्विक मूल्य में enum मान जोड़े नहीं गए हैं। स्कोप्ड एनम के सदस्य को निर्दिष्ट करने के लिए, आपको enum के प्रकार को शामिल करना होगा।

+0

शायद इसे दस्तावेज़ों * गणना के ** मूल्य ** प्रतीकों * में मुद्रित किया जाना चाहिए। प्रकार स्वयं 'सख्त निजी' है लेकिन मूल्य नहीं है। यह पहली नजर में स्पष्ट नहीं है, दूसरे या तीसरे पर अधिक: ओ) –

संबंधित मुद्दे