2014-10-03 3 views
7

में इंटरफ़ेस परिभाषाओं में कक्षा विधियों का समर्थन कैसे करें मैंने एक कक्षा में एक क्लास विधि बनाई है जो एक इंटरफ़ेस लागू करता है, लेकिन मैं इसे इंटरफ़ेस के अंदर परिभाषित नहीं कर सकता।डेल्फी

IMyClass = interface 
    procedure someproc(); 
    class function myfunc() : TMyClass; // compiler doesn't like this! 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    class function myfunc() : TMyClass; 
end; 

मैं बना सकते हैं और TMyClass का एक उदाहरण वापस जाने के लिए myfunc() चाहते हैं। उदाहरण के लिए:

somefunc(TMyClass.myfunc(), ...); 

TMyClass का एक उदाहरण बनाता है और somefunc में गुजरता है।

मैं IM12Class इंटरफ़ेस में function myfunc() : TMyClass; परिभाषित कर सकता हूं, लेकिन अगर मैं इसके सामने class डालता हूं, तो संकलक मुझे एक त्रुटि देता है। अगर मैं इसे छोड़ देता हूं, तो यह मुझे कई अन्य त्रुटियों देता है "ई 22 9 1 इंटरफ़ेस विधि xyz.myfunc का कार्यान्वयन गुम है" यह कक्षा में इंटरफ़ेस में समान हस्ताक्षर स्वीकार नहीं करता है।

मैंने सोचा कि मैंने पहले यह काम देखा है (इंटरफेस में परिभाषित कक्षा विधियों) लेकिन शायद नहीं।

यदि यह सीधे समर्थित नहीं है, तो आप इसे कैसे करते हैं?

(मैं डेल्फी XE5 उपयोग कर रहा हूँ, इस मामले में यह मायने रखती है।)

+0

एक वर्ग विधि –

+0

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

+0

यह सही है। इंटरफेस को लागू करने के लिए आपको एक उदाहरण की आवश्यकता है। –

उत्तर

5

इंटरफेस कक्षाएं नहीं हैं और class के रूप में चिह्नित तरीकों का समर्थन नहीं करते, वे केवल गैर class तरीकों कि लागू किया और वस्तु उदाहरणों पर कहा जाता है का समर्थन ।

जो आप खोज रहे हैं, उसे इंटरफ़ेस का उपयोग करने के बजाय क्लास फैक्ट्री के रूप में लागू किया जाना चाहिए।

0

आप कक्षा परिभाषा (टीएमई क्लास) में कक्षा विधि (डेल्फी में कक्षा प्रक्रिया) को परिभाषित कर सकते हैं लेकिन इंटरफ़ेस (IMyClass) में नहीं।

+0

डेविड एक इंटरफेस में कक्षा विधि को परिभाषित करने की कोशिश नहीं कर रहा है। वह कक्षा विधि के साथ एक इंटरफेस विधि को लागू करने की कोशिश कर रहा है। –

2

जो आप प्राप्त करने की कोशिश कर रहे हैं वह असंभव है क्योंकि यह डेल्फी इंटरफेस के द्विआधारी विनिर्देशों का उल्लंघन करता है।

डेल्फी में किसी भी इंटरफ़ेस विधि ने पहले पैरामीटर को छुपाया है - एक उदाहरण के लिए सूचक। इंस्टेंस विधियों में एक ही छुपा पैरामीटर होता है (Self, एक उदाहरण के लिए एक ही सूचक) और इसके कारण वे इंटरफ़ेस विधियों के साथ बाइनरी संगत हैं।

दूसरी ओर क्लास विधि का छुपा पैरामीटर क्लास vtable के लिए एक सूचक है, इसलिए डेल्फी क्लास विधियां डेल्फी इंटरफ़ेस विधियों के साथ बाइनरी असंगत हैं।

Hypothetically आप निम्नलिखित (बाइनरी संगत) घोषणाओं के बारे में सोच सकता है:

IMyClass = interface 
    procedure someproc(); 
    function myfunc(): TMyClass; 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    class function myfunc(Inst: TMyClass) : TMyClass; static; 
end; 

यहाँ मैं static विनिर्देशक का उपयोग छिपा पैरामीटर (वर्ग vtable सूचक) हम की जरूरत नहीं है को हटाने और उदाहरण सूचक पैरामीटर जोड़ने का स्पष्ट रूप; लेकिन संकलक इस तरह के वाक्य रचना का समर्थन क्योंकि ऊपर अनिवार्य रूप में ही है करता है एक सरल

IMyClass = interface 
    procedure someproc(); 
    function myfunc(): TMyClass; 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    function myfunc() : TMyClass; 
end; 
+0

ठीक है, अगर इंटरफ़ेस में कक्षा विधियों का समर्थन करने के लिए कभी भी कोई बदलाव आएगा, तो यह मानना ​​सुरक्षित है कि यह संभव बनाने के लिए बाइनरी प्रतिनिधित्व बदल जाएगा। – mjn