2011-07-04 15 views
5

पर टीपीआरसी और संदर्भों के आंतरिक (स्मृति) का प्रतिनिधित्व क्या कोई यहां जानता है कि डेल्फी प्रक्रिया के संदर्भ का प्रतिनिधित्व कैसे करता है?सभी

उदाहरण

var 
    proc: TProc; 
... 
proc = procedure begin beep end; 

क्या हम "proc" में मिला है के लिए

?

मुझे पता है कि "विधि परिवर्तनीय" के लिए स्मृति प्रस्तुति "ऑब्जेक्ट एड्रेस" के लिए 4 बाइट्स के बाद "प्रक्रिया पता" के लिए 4 बाइट्स है, लेकिन "प्रक्रिया के संदर्भ" के लिए कुछ अलग है और मैं काफी आंकड़ा नहीं कर सकता यह बाहर।

कारण मैं इस चाहते हैं, क्योंकि मैं कुछ विरासत कोड है कि मैं इसे संदर्भ के साथ काम करने के लिए करना चाहते हैं है।

क्या किसी को इसके बारे में कुछ पता है?

+1

http://alex.ciobanu.org/?p=27 –

+2

सामान्य 'संदर्भ procedure' करने के लिए एक विशेष संकलक उत्पन्न इंटरफ़ेस चर में आयोजित किया जाता है। यह सुनिश्चित करता है कि यह संदर्भ गिना जाता है ताकि जब कोई संदर्भ न बने, तो कैप्चर किए गए चर को दूर किया जा सकता है। 'संदर्भ' के साथ काम करने के लिए आपको यह जानने की आवश्यकता नहीं है कि इसे कैसे कार्यान्वित किया जाता है। यही कारण है कि आपके पास एक कंपाइलर है। –

उत्तर

10

विधि संदर्भ एक भी विधि Invoke कहा जाता है, जो विधि संदर्भ के रूप में एक ही हस्ताक्षर हैं के साथ एक COM शैली इंटरफेस के रूप में लागू कर रहे हैं।

तो TProc इस तरह दिखता है:

type 
    TProc = interface(IInterface) // so inherits QI, AddRef, Release 
    procedure Invoke; 
    end; 

यह एक वैध सवाल पूछने के लिए है के रूप में डेल्फी सी ++ उत्पाद के साथ अंतर है। पूर्व-मौजूदा संदर्भ-गिनती प्रकार और मुहावरे (COM आजीवन नियम) का उपयोग करके, विधि संदर्भ स्तर पर C++ के साथ इंटरऑप संभव है।

बेनामी तरीकों एक छिपा वर्ग जो विधि संदर्भ इंटरफ़ेस isomorphic को एक अंतरफलक को लागू करता है, यानी बिल्कुल एक ही आकार, लेकिन एक ही प्रतीकात्मक पहचान के साथ नहीं उत्पन्न करते हैं। छुपा वर्ग विधि संदर्भ इंटरफ़ेस को सीधे लागू नहीं करता है क्योंकि इसे इंटरफ़ेस को कई बार कार्यान्वित करने की आवश्यकता हो सकती है (एक ब्लॉक में एक ही विधि संदर्भ प्रकार के स्थानों को आवंटित कई अज्ञात विधियां हो सकती हैं)।

+0

यह जानना अच्छा था। धन्यवाद बैरी केली। – Nedko

+1

@ बेरी: हमेशा के रूप में दिलचस्प! मुझे कई बार अंतिम अनुच्छेद पढ़ना पड़ा, लेकिन मुझे लगता है कि मैं समझता हूं। यह एक मूर्ख सवाल हो सकता है, मुझे डर है, लेकिन: क्या ब्रैकेट अनुभाग का मतलब है कि एक विधि संदर्भ छिपी कक्षा का एक उदाहरण कई अज्ञात तरीकों को लागू करने के लिए बनाया गया है, जहां कई सामान्य प्रक्रिया में परिभाषित होते हैं (या समान अन्य दायरा)? यह लगता है ... जटिल :) –

+2

@ डेविड अज्ञात विधियां स्थानीय चर को कैप्चर कर सकती हैं; जब आपके पास एक ही चर को कैप्चर करने वाले कई अज्ञात विधियां हैं, तो उन्हें राज्य साझा करने की आवश्यकता है। डेल्फी का कार्यान्वयन एक ही ऑब्जेक्ट में ब्लॉक में अज्ञात विधियों से जुड़े सभी राज्य (यानी कब्जे वाले चर) को रखता है; प्रत्येक अज्ञात विधि इस ऑब्जेक्ट की कक्षा पर एक विधि में बदल जाती है, जबकि प्रत्येक कैप्चर वैरिएबल एक फ़ील्ड में बदल जाता है। –

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