2015-11-13 12 views
15

Program geliştirme sırasında yanlışlıkla bir sınıflar içinde bildirilir her türlü küresel görünürlüğü olduğunu saptadık.Özel türler herkes tarafından görülebilir mi?

Hep tip TMyClass.TMytype.Value gibi sınıf tipi adıyla anılır sürece kendi görünürlük sınıfına sınırlı olduğunu düşündüm;

aşağıdaki gibi yapıları olarak, gerçekten yanlış burada bir şey yapıyor muyum:

unit MyTest; 

interface 

type TMyTest = class 
    constructor Create; 

    strict private 
     type TMyType = (NUL, SLEEP); 

end; 

implementation 

// ... 

bu (MyTest) birimini kullanan diğer birimlerde çatışmaları neden olur.

birim Uyku varsa (100); çağrı, TMyTest.TMyType.SLEEP ile çakışacak ve çakışmaların önlenmesi ilk olarak SLEEP sınıfında ve TMyType içinde kapsüllemedim.

bir geçici çözümler için herhangi bir öneri?

+1

Gerçekten şaşırtıcı ama David onun cevabını bahseder gibi: o enum değerleri için kasıtlı bu. FYI: Enum değerlerinin kapsam çatışması, uzun yıllardır Delphi'de bir sorun olmuştur. Bu nedenle, sözleşmelerle, geliştiriciler genellikle enum değerlerini ön ekler. Örneğin. TMyType = (mtNUL, mtSLEEP); '(Kod stili tutarlılığını sağlamayı düşünmeye değer bir şey.) Daha genel uygulanabilirliği için değinmeye değecek başka bir çözüm: tanımlayıcıların çatıştığı yerde, çatışmayı çözmek için istenen birim adını önekleyebilirsiniz. Örneğin. 'Windows.Sleep' –

cevap

14

Bu, tasarımdan aslında. Enum değerlerinizin birimi veya genel kapsamı var. Onlar sınıfın bir parçası olmadıkları için özel değiller. Onlar küresel düzeyde kapsamlıdır.

enum değerleri scoped enums yönerge dahil ederek yerel bir kapsama sahip olmaları için Sen sağlayabilir:

{$SCOPEDENUMS ON} 

$SCOPEDENUMS direktif sağlayan veya Delphi kodu kapsamlı numaralandırma kullanımını devre dışı bırakır. Daha spesifik olarak, $SCOPEDENUMS sadece yeni numaralandırma tanımlarını etkiler ve yalnızca numaralandırma sembollerinin global kapsam için eklenmesini kontrol eder.

{$SCOPEDENUMS ON} durumunda, numaralandırmalar kapsamlandırılır ve enum değerleri genel kapsama eklenmez. Kapsamlı bir enum üyesinin bir üyesini belirtmek için, enum'un türünü eklemelisiniz.

+0

Belki de dokümanlarda * numaralandırma ** değeri ** sembolleri * basılmalıdır. Türün kendisi 'sıkı özel' değil, değerler. Bu ilk bakışta net değil, daha fazla ikinci veya üçüncü: o) –

İlgili konular