जब मैं "इन" अनुबंधों के साथ डी में कार्यों को ओवरराइड करता हूं, तो विरासत में "इन" अनुबंधों की जांच की जाती है। अगर वे असफल होते हैं, तो ओवरराइड "इन" अनुबंधों की जांच की जाती है। अगर मैं अनुबंध में किसी को निर्दिष्ट नहीं करता हूं, तो इसका अर्थ यह है कि एक खाली "इन" अनुबंध है। तो निम्न कोड संकलित और सफलतापूर्वक चलाता है।डी इंटरफेस में मैं पूर्व शर्त अनुबंध का अर्थ कैसे उपयोग कर सकता हूं?
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); }
लिख सकता हूं, लेकिन यह एक दर्द है। क्या यह डी भाषा में एक डिजाइन त्रुटि है? या ऐसा करने के लिए कोई उचित स्केलेबल तरीका है?
मुझे यकीन नहीं है कि क्या प्रलेखन पृष्ठ पुराना नहीं है। मुझे यह सुनिश्चित करने के लिए टीडीपीएल देखना होगा, लेकिन ओपी के मुद्दे के समान एक बग है: http://d.puremagic.com/issues/show_bug.cgi?id=6549 – jpf
@jpf यह एक वृद्धि अनुरोध है। कुछ लोग इस मुद्दे के संबंध में भाषा बदलना चाहते हैं। वर्तमान व्यवहार के संबंध में दस्तावेज सही है। –
ओह ठीक है, मुझे यह एहसास नहीं हुआ। – jpf