में संकलन-समय इंटरफ़ेस कार्यान्वयन जांच I C++ में छद्म-इंटरफेस का उपयोग कर रहा हूं, यानी शुद्ध सार वर्ग। मान लीजिए मेरे पास तीन इंटरफेस, इफू, इबार और आईक्यूक्स हैं। एक फ्रेड काम करेगा, उदाहरण के लिए -सी ++
interface IFoo
{
void foo (void);
}
interface IBar
{
void bar (void);
}
interface IQuux
{
void quux (void);
}
class Fred : implements IFoo, IBar, IQuux
{
}
मैं एक विधि है कि किसी भी वस्तु है कि IFoo और Ibar लागू करता है स्वीकार करता है की घोषणा करना चाहते हैं: मैं भी एक वर्ग फ्रेड है कि उनमें से सभी तीन को लागू करता है। एक IFooAndBar * प्राप्त करने के रूप
interface IFooAndBar : extends IFoo, IBar
{
}
class Fred : implements IFooAndBar, IQuux
{
}
अब मैं अपने प्रणाली की घोषणा कर सकते हैं: केवल संकलन समय जिस तरह से यह मैं कल्पना कर सकते हैं करने के लिए एक तिहाई इंटरफ़ेस IFooAndBar है कि दोनों को लागू करता है परिभाषित करने के लिए, और फ्रेड redeclare है। अब तक सब ठीक है।
हालांकि, क्या होता है अगर मैं भी एक अलग तरीके है कि Ibar और IQuux स्वीकार करता है करना चाहते हैं? मैं एक नया इंटरफेस IBarAndQuux घोषित करने और दोनों इनहेरिट के रूप में फ्रेड घोषित करने की कोशिश की:
class IFooAndBar : IFoo, IBar
{
};
class IBarAndQuux : IBar, IQuux
{
};
class Fred : IFooAndBar, IBarAndQuux
{
};
यह काम करता है जब मैं एक पद्धति के लिए एक IFooAndBar के रूप में फ्रेड पास; हालांकि, जब मैं फ्रेड :: बार फोन करने की कोशिश() सीधे, जीसीसी की शिकायत:
error: request for member ‘bar’ is ambiguous
error: candidates are: void IBar::bar()
error: void IBar::bar()
जो इस समाधान कम या ज्यादा बेकार बना देता है।
मेरा अगला प्रयास तीन अलग-अलग इंटरफेस से इनहेरिट, और विधि एक पैरामीटर के रूप संकर इंटरफेस में से एक को स्वीकार कर रही है के रूप में फ्रेड घोषित करने के लिए किया गया था:
class Fred : public IFoo, public IBar, public IBaz
{
};
void doTest (IBarAndBaz* pObj)
{
pObj->bar();
pObj->baz();
}
जब मैं पारित करने के लिए कोशिश
error: cannot convert ‘Fred*’ to ‘IBarAndBaz*’ for argument ‘1’ to ‘void doTest(IBarAndBaz*)’
dynamic_cast < p> भी: IBarAndBaz के रूप में फ्रेड * पैरामीटर, मैं एक त्रुटि, अपेक्षा के अनुरूप मिल एक
error: cannot dynamic_cast ‘pFred’ (of type ‘class Fred*’) to type ‘class IBarAndBaz*’ (source type is not polymorphic)
एक डाली काम है, तथापि करता जबरदस्ती त्रुटि (जो मुझे समझ नहीं आता) roduces:
doTest((IBarAndBaz*)pFred);
लेकिन मुझे आश्चर्य है कि सुरक्षित और पोर्टेबल यह है (मैं लिनक्स के लिए विकसित कैसे, मैक और विंडोज), और क्या यह वास्तविक दुनिया की स्थिति में काम करता है।
अंत में, मुझे लगता है मेरी विधि अन्य (रों) कार्यावधि में सही पैरामीटर प्रकार लागू करने के लिए करने के लिए इंटरफेस में से एक और dynamic_cast के लिए सूचक स्वीकार कर सकते हैं, लेकिन मैं एक संकलन समय समाधान पसंद करते हैं।
यह सुरक्षित नहीं है और यह पोर्टेबल है। वास्तव में, यह सी ++ में अपरिभाषित है। –