2009-09-29 8 views
6

क्या यह डेल्फी (Win32) में पूरी कक्षा घोषित करने के लिए संभव है (न केवल कक्षा का एक कार्य) स्थिर है?डेल्फी में स्थिर कक्षाएं (Win32)

+0

मैन्युअल रूप से प्रत्येक और हर चर, वस्तु और विधि स्थिर बनाने के (कक्षा var)। यह सब – VibeeshanRC

उत्तर

5

मुझे लगता है कि आप .net (जैसे पारंपरिक डेल्फी/मूल) में "स्थिर" नहीं हैं - और इसका उत्तर नहीं है।

+2

हो सकता है कि यह आपको समझने में सहायता कर सकता है क्यों: स्टेटिक कक्षाओं का उपयोग अक्सर डेल्फी में इकाइयों के समान तरीके से encapsulation के लिए किया जाता है। –

+2

मैं मानना ​​पसंद नहीं करूंगा। क्या आप इसे स्पष्ट रूप से स्पष्ट कर सकते हैं * * * * * स्थिर * से क्या मतलब है? –

4

मुझे यकीन नहीं है कि आप "स्थिर वर्ग" से क्या मतलब रखते हैं। आप एक वर्ग घोषित कर सकते हैं, जिसमें केवल वर्ग विधियां हैं, इसलिए इन विधियों को कक्षा को तत्काल किए बिना बुलाया जा सकता है।

TSomeClass.SomeMethod; 

क्या आप चाहते हैं कि?

2

मूल रूप से नहीं।

यदि आपको अपने कोड के प्रयोजनों के लिए इसकी आवश्यकता है, तो कुछ उपयोग मामलों में आप इसे सिंगलटन पैटर्न ऑब्जेक्ट से प्रतिस्थापित कर सकते हैं।

को लागू करने के लिए इस मैं this guide की सलाह देते हैं जो, डेल्फी के लगभग किसी भी संस्करण को शामिल किया गया पर की जानकारी के लिए

, लेकिन अगर आप डेल्फी 2010 का उपयोग कर रहे हैं तो आप भी बेहतर परिणामों के लिए नए class Constructors/Destructors इस्तेमाल कर सकते हैं।

1

आप यूडीजी_यूटिल नामक एक नई इकाई भी बना सकते हैं उदाहरण के लिए, कक्षा को परिभाषित करें, उस वर्ग के लिए एक वैश्विक चर परिभाषित करें और आरंभिक और अंतिमकरण अनुभाग में आप क्लास कन्स्ट्रक्टर और विनाशक का प्रबंधन करें। अब आपको बस इतना करना है कि इसे mySuperDuperClass.SuperMethod की तरह कॉल करें ...

1

आप ऐसी कक्षा बना सकते हैं जिसमें स्थिर विधियों के अलावा कुछ भी नहीं है। यदि आपको किसी प्रकार का राज्य बनाए रखना है, तो राज्य चर को var पैरामीटर के रूप में पारित किया जाना चाहिए। "ठीक से" वर्ग के दायरे से बाहर वर्ग के कार्यान्वयन खंड में वैश्विक चर का एक सेट होने के अलावा अन्य स्थैतिक चर का उपयोग करने का कोई तरीका उदाहरण के लिए, नहीं है:

UNIT TestUnit; 

INTERFACE 

Type 
    TStaticClass = Class 
    public 
    procedure Foo(var Bar:String); static; 
    end; 

IMPLEMENTATION 

var 
    LastBar : String; // the last bar 
    LastRes : string; // the last result 

Procedure TStaticClass.Foo(var Bar:String); 
begin 
    if Bar <> LastBar then 
    LastRes := SomeCPUExpensiveProcess(Bar); 
    LastBar := Bar; 
    Bar := LastRes; 
end; 

INITIALIZATION 
    LastBar := ''; 
    LastRes := SomeCPUExpensiveProcess(''); 
END. 
-1

(हाँ, मैं इस सूत्र को पता है पुराना है, लेकिन सोचा कि मैं इसे पोस्टरिटी के लिए पोस्ट करूंगा।)

यह इंगित किया गया है कि कक्षा कार्य और कक्षा प्रक्रियाएं स्थिर तरीकों को लागू करती हैं। लेकिन मैं जोड़ूंगा कि एक स्थिर वर्ग (एक डेल्फी वर्ग बनाम) का अगला उल्लेखनीय व्यवहार यह है कि एक स्थिर वर्ग को तत्काल नहीं किया जा सकता है।

डेल्फी कक्षाओं को एक सार्वजनिक डिफ़ॉल्ट (पैरामीटर रहित) कन्स्ट्रक्टर मिलता है यदि आप एक निर्दिष्ट नहीं करते हैं, तो किसी भी वर्ग को तत्काल किया जा सकता है। यदि आप स्पष्ट रूप से एक या अधिक रचनाकार घोषित करते हैं, तो यह कन्स्ट्रक्टर प्रदान नहीं किया जाता है।

आप अपने वर्ग के निजी या संरक्षित अनुभाग में एक कन्स्ट्रक्टर घोषित करके सभी रचनाकारों को हटा सकते हैं। यह आपके कन्स्ट्रक्टर को उपभोक्ता के दायरे से हटा देता है। अब केवल एक कन्स्ट्रक्टर है, यह दिखाई नहीं दे रहा है और कक्षा को तत्काल नहीं किया जा सकता है।

उदाहरण:

type 
    TMyStaticClass = class(TObject) 
    private 
    // Hide the default constructor, suppressing hint H2219. 
    {$HINTS OFF} constructor Create; {$HINTS ON} 
    public 
    class procedure Method1; // A static method 
    end; 

implementation 

constructor TMyStaticClass.Create; 
begin 
    // Do nothing. This cannot be called. 
end; 

class procedure TMyStaticClass.Method1(); 
begin 
    // Do something here. 
end; 

आप डेल्फी के नए संस्करण में से एक है, तो आप भी वर्ग सील सिर्फ एक थोड़ा और अधिक उचित होना करने के लिए विचार कर सकते हैं। यदि आपके कन्स्ट्रक्टर को निजी के बजाय संरक्षित किया गया है तो वंशज वर्गों को तत्काल किया जा सकता है।


संपादित

यहाँ एक वैकल्पिक, नए डेल्फी संस्करणों (जो सील वर्गों का समर्थन करते हैं) के लिए, केन से प्रेरित है जो एक संकलक संकेत उठाना नहीं करता है। यह अभी भी एक आदर्श समाधान नहीं है, लेकिन यहां यह है।

unit Unit1; 

interface 

type 
    TMyStaticClass = class sealed (TObject) 
    protected 
    constructor Create; 
    public 
    class procedure Method1; // A static method 
    end; 

implementation 

constructor TMyStaticClass.Create; 
begin 
    // Do nothing. This cannot be called. 
end; 

class procedure TMyStaticClass.Method1(); 
begin 
    // Do something here. 
end; 

end. 
+2

तथ्य यह है कि आपको संकेतों को बंद करना है, आपको यह बताने चाहिए कि यह खराब कोड है। –

+0

वह ऐसी सुविधा मांग रहा है जो समर्थित नहीं है, इसलिए कोई समाधान सही नहीं होगा। संकेतों के लिए, मैं आमतौर पर सहमत हूं और संकेतों को बंद करने के लिए अनुकूल नहीं हूं। संकेत आमतौर पर सही होते हैं और गलतियों को इंगित करते हैं जो गंभीर और अपमानजनक हो सकते हैं। लेकिन इस मामले के करीब देखो। 1- कोड डेल्फी 7 में कोई संकेत नहीं पैदा करता है। तो क्या यह डेल्फी 2010 में खराब कोड है, लेकिन डेल्फी 7 में नहीं? शायद हो सकता है। 2- चेतावनी "घोषित की गई है लेकिन कभी भी उपयोग नहीं की जाती"। यदि आप 2010 में कक्षा को संरक्षित और सील करने के लिए निजी बदलते हैं, तो अभी भी छिपा हुआ है लेकिन संकेत दूर हो गया है। क्या इससे बेहतर हो जाता है? ... –

+0

... मुझे नहीं लगता है। लेकिन मुझे स्पष्ट होने दो; मुझे नहीं लगता कि आप गलत हैं, बस यह विशेष मामला एक संभावित अपवाद है और मुझे लगता है कि यह कई बुराइयों में से कम है, जैसे कि तत्कालता को रोकने के लिए सार्वजनिक कन्स्ट्रक्टर में अपवाद फेंकना। किसी भी मामले में, यहां तक ​​कि यह भी, आपका बिंदु मान्य है और मैं इसे किसी पर विचार करने से हतोत्साहित नहीं करना चाहता हूं। –

5

मैं इसे बजाय instantiated किया जा रहा करने के लिए संरक्षित निर्माता अवनत से रोकने के लिए एक अमूर्त वर्ग (एक कक्षा में एक सार विधि के साथ भ्रमित होने की नहीं) का प्रयोग करेंगे:

TMyClass = class abstract 
public 
    class procedure DoStuff; static; 
end; 

लागू करेंगे कि सिंगलटन पैटर्न और किसी भी तत्काल अवधि को रोकें।

8

"वर्ग कार्यों के लिए" उपयोगकर्ता की खोज की तरह लग रहा:

type 
TSomeClass = class 
class procedure MyFunction(...); 

यह स्थिर विधि की तरह है, हां, तो यह कहते हैं:

TSomeClass.MyFunction(...); 
संबंधित मुद्दे