delphi - Is interface inheritance nothing more than syntactic sugar? -


नीचे कोड काम नहीं करता है।

  प्रोग्राम Project7; {$ APPTYPE कंसोल} {$ R * .res} का उपयोग करता है System.SysUtils; प्रकार I1 = इंटरफ़ेस ['{B4BF44AD-23A 9-4F42-BA2B-6E137E22344E}'] प्रक्रिया 1 परीक्षा; समाप्त; I2 = इंटरफेस (I1) ['{AAAAAAAA-23A 9-4F42-BA2B-BBBBBBBBBBBB}'] प्रक्रिया टेस्ट 2; समाप्त; टी 12 = वर्ग (टीइंटरफेस ओब्जेक्ट, आई 2) सार्वजनिक प्रक्रिया 1 परीक्षा; प्रक्रिया परीक्षण 2; सार्वजनिक समारोह MeAsI1: I1; समारोह MeASI2: I2; समाप्त; समारोह T12.MeAsI1: I1; परिणाम शुरू: = (I1 के रूप में आत्म); समाप्त; फ़ंक्शन T12.MeASI2: I2; परिणाम शुरू करें: = (I2 के रूप में आत्म); समाप्त; प्रक्रिया T12.Test1; राइटेलन ('टी 12: इंटरफ़ेस i1 से test1') शुरू करें; समाप्त; प्रक्रिया T12.Test2; राइटेलन ('टी 12: इंटरफ़ेस i2 से test2') शुरू करें; समाप्त;  

अभिकलन:

  var MyClass: T12; AI1: I1; ए 2: I2; शुरू MyClass: = T12.Create; ए 2: = मायक्लस। मेएएसआई 2; AI2.Test2; Readln; AI1: = MyClass.MeAsI1; // & lt; & lt; अपवाद इंटरफ़ेस समर्थित नहीं AI1.Test1; Readln; समाप्त।  

यह एक अपवाद देता है: इंटरफ़ेस समर्थित नहीं
ऐसा लगता है कि इंटरफ़ेस वंशानुक्रम वास्तव में जैसा काम नहीं करता है वर्ग उत्तराधिकार
अगर मैं इंटरफ़ेस I1 को वर्ग T12 में जोड़ता है, तो यह काम करता है, लेकिन जब कोई क्लास कई इंटरफेस लागू करता है, तो यह थोड़ा मूर्खतापूर्ण हो जाता है
क्या I2 को ही घोषित करने का एक तरीका है और फिर भी कक्षा के अंदर से I1 के संदर्भ वापस करने में सक्षम हो?
मैं डेल्फी XE6 का उपयोग कर रहा हूं, लेकिन मुझे यकीन है कि त्रुटि डेल्फी 3 में समान है।

संपादित करें
इसके लिए उपयोग का मामला होगा:

  IReadOnly = इंटरफ़ेस फ़ंक्शन GetSomething: पूर्णांक ; ... IRWIntf = इंटरफेस (IReadOnly) प्रक्रिया SetSomething (मान: पूर्णांक); ....  

इंटरफ़ेस वंशानुक्रम इंटरफेस के तर्क का अनुसरण करता है। एक अंतरफलक के साथ आप किसी भी कार्यान्वयन के बिना घोषणा को परिभाषित कर सकते हैं। इसलिए इनहेरिट की गई इंटरफ़ेस में एक ही घोषणा है और कुछ और नहीं है और इसलिए कोई भी विरासत नहीं होगा।

लेकिन आप निम्न कार्य कर सकते हैं

  प्रक्रिया UseI1 (AI1: I1) ; शुरू AI1.Test1; समाप्त; प्रक्रिया का प्रयोग I2 (एआई 2: आई 2); एआई 2 शुरू करें। टेस्ट 1; AI2.Test2; UseI1 (एआई 2); // विरासत अंतरफलक अंत का उपयोग;  

यदि आप चाहते हैं कि आपका नमूना वर्ग I1 को आउटपुट करे, तो आपको विधि बदलनी होगी

  function T12.MeAsI1: I1; Var LI2: I2; शुरू 2 LI2: = स्व; परिणाम: = LI2; समाप्त;  

लेकिन आपको उस से सावधान रहना होगा क्लाइंट के बारे में सोचें I1 और I2

  TImplementor = class (TInterfacedPersistent, I1, I2) निजी प्रक्रिया I1_Test1; प्रक्रिया I2_Test1; प्रक्रिया I2_Test2; प्रक्रिया I1.Test1 = I1_Test1; प्रक्रिया I2.Test1 = I2_Test1; प्रक्रिया I2.Test2 = I2_Test2; समाप्त; प्रक्रिया TImplementor.I1_Test1; राइटेलन ('I1_Test1') शुरू; समाप्त; प्रक्रिया TImplementor.I2_Test1; राइटेलन ('I2_Test1') शुरू; समाप्त; प्रक्रिया TImplementor.I2_Test2; राइटेलन ('I2_Test2') शुरू; समाप्त;  

अब हम इस का उपयोग कर सकते हैं

  var लिमिलेटर: टिमिअलेटर; लिमिलेटरर शुरू करें: = अनुपूरक। बनाएं; UseI1 (अनुपूरक) का प्रयास करें; // आउटपुट // I1_Test1 UseI2 (अनुपूरक); // आउटपुट // I2_Test1 // I2_Test2 // I2_Test1 !!!!! अंत में LImplementor.Free; समाप्त; समाप्त;  

हालांकि हम UseI1 दो बार कॉल करते हैं, हमें दो भिन्न आउटपुट मिलते हैं, क्योंकि दो अलग-अलग तरीकों को बुलाया गया था।


Comments

Popular posts from this blog

java - org.apache.http.ProtocolException: Target host is not specified -

java - Gradle dependencies: compile project by relative path -

ruby on rails - Object doesn't support #inspect when used with .include -