2012-07-27 34 views
5

जब मैं "इन" अनुबंधों के साथ डी में कार्यों को ओवरराइड करता हूं, तो विरासत में "इन" अनुबंधों की जांच की जाती है। अगर वे असफल होते हैं, तो ओवरराइड "इन" अनुबंधों की जांच की जाती है। अगर मैं अनुबंध में किसी को निर्दिष्ट नहीं करता हूं, तो इसका अर्थ यह है कि एक खाली "इन" अनुबंध है। तो निम्न कोड संकलित और सफलतापूर्वक चलाता है।डी इंटरफेस में मैं पूर्व शर्त अनुबंध का अर्थ कैसे उपयोग कर सकता हूं?

module main; 
import std.stdio; 

interface I 
{ 
    void write(int i) 
    in 
    { 
     assert(i > 0); 
    } 
} 

class C : I 
{ 
    void write(int i) 
    { 
     writeln(i); 
    } 
} 

int main() 
{ 
    I i = new C; 

    i.write(-5); 
    getchar(); 

    return 0; 
} 

मैं केवल I.write() की पूर्व शर्त जांच की जानी है जब मैं i.write() फोन के बाद से वह यह है कि क्या स्थिर I.write() संकलक द्वारा सही ढंग से चलाने के लिए पर्याप्त माना जाता है चाहता हूँ। के बाद सभी पूर्व शर्त की जांच करना गतिशील प्रेषण मुझे ओओ परिप्रेक्ष्य से अजीब बनाता है क्योंकि encapsulation खो जाता है।

मैं इंटरफ़ेस को लागू करने वाले सभी वर्गों में पूर्व शर्त दोहरा सकता हूं या in { assert(false); } लिख सकता हूं, लेकिन यह एक दर्द है। क्या यह डी भाषा में एक डिजाइन त्रुटि है? या ऐसा करने के लिए कोई उचित स्केलेबल तरीका है?

उत्तर

3

http://dlang.org/dbc.html

एक व्युत्पन्न वर्ग में एक समारोह में अपनी सुपर कक्षा में एक समारोह को ओवरराइड करता है, तो केवल इसके आधार कार्यों समारोह के ठेके और में से एक संतुष्ट होना चाहिए। कार्यों को ओवरराइड करने के बाद अनुबंधों को ढीला करने की प्रक्रिया बन जाती है।

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

इसके विपरीत, सभी अनुबंधों को संतुष्ट करने की आवश्यकता है, इसलिए ओवरराइडिंग फ़ंक्शंस आउट अनुबंधों को कसने की प्रक्रिया बन जाती है।

वास्तव में यह एक कठिन डिजाइन पहेली है जब पॉलिमॉर्फिक व्यवहार प्रश्न में आता है। उदाहरण के लिए, इस लंबी रिपोर्ट में संबंधित लंबी चर्चा के साथ देखें: http://d.puremagic.com/issues/show_bug.cgi?id=6857

प्रश्न के संबंध में वांछित व्यवहार कैसे प्राप्त करें - मिश्रित हमेशा काम करता है जब कॉपी-पेस्ट को रोका जाना चाहिए, लेकिन मुझे यकीन नहीं है कि यह करना ठीक है यह अनुबंध प्रतिमान द्वारा डिजाइन के बिंदु से। दुर्भाग्यवश, इस प्रश्न सलाह में किसी और सैद्धांतिक रूप से सक्षम की जरूरत है।

+0

मुझे यकीन नहीं है कि क्या प्रलेखन पृष्ठ पुराना नहीं है। मुझे यह सुनिश्चित करने के लिए टीडीपीएल देखना होगा, लेकिन ओपी के मुद्दे के समान एक बग है: http://d.puremagic.com/issues/show_bug.cgi?id=6549 – jpf

+0

@jpf यह एक वृद्धि अनुरोध है। कुछ लोग इस मुद्दे के संबंध में भाषा बदलना चाहते हैं। वर्तमान व्यवहार के संबंध में दस्तावेज सही है। –

+0

ओह ठीक है, मुझे यह एहसास नहीं हुआ। – jpf

0

डी में एक पूर्व शर्त सही ढंग से चलाने के लिए एक आवश्यकता है। यदि आप फ़ंक्शन को अधिभारित करते हैं, तो आप इसके लिए एक नया कोड लिखते हैं, पुरानी पूर्व शर्त - जो पुराने कोड की आवश्यकता है - नए कोड के लिए जरूरी नहीं है।

0

तो इस मुद्दे को, जबकि नहीं सीधे इंटरफेस के बारे में चर्चा की, http://d.puremagic.com/issues/show_bug.cgi?id=6856

यह एक कठिन एक यद्यपि में प्राप्त करने के लिए हो सकता है, वाल्टर कोई तोड़ने बात बदल जाता है पर बड़ा है।