मुझे पता है कि हीरा विरासत को खराब अभ्यास माना जाता है। हालांकि, मेरे पास 2 मामले हैं जिनमें मुझे लगता है कि हीरा विरासत बहुत अच्छी तरह से फिट हो सकती है। मैं पूछना चाहता हूं, क्या आप मुझे इन मामलों में हीरा विरासत का उपयोग करने की सलाह देंगे, या कोई और डिज़ाइन है जो बेहतर हो सकता है।डायमंड विरासत (सी ++)
केस 1: मैं कक्षाएं बनाना चाहता हूं जो मेरे सिस्टम में विभिन्न प्रकार की "क्रियाएं" का प्रतिनिधित्व करते हैं। कार्यों को कई मानकों द्वारा वर्गीकृत किया जाता है:
- कार्रवाई "पढ़ा" या "लिखें" हो सकती है।
- कार्रवाई देरी या देरी के बिना हो सकती है (यह केवल 1 पैरामीटर नहीं है। यह व्यवहार को महत्वपूर्ण रूप से बदलता है)।
- क्रिया का "प्रवाह प्रकार" फ़्लो या फ्लोबी हो सकता है।
मैं निम्नलिखित डिजाइन करने का इरादा:
// abstract classes
class Action
{
// methods relevant for all actions
};
class ActionRead : public virtual Action
{
// methods related to reading
};
class ActionWrite : public virtual Action
{
// methods related to writing
};
class ActionWithDelay : public virtual Action
{
// methods related to delay definition and handling
};
class ActionNoDelay : public virtual Action {/*...*/};
class ActionFlowA : public virtual Action {/*...*/};
class ActionFlowB : public virtual Action {/*...*/};
// concrete classes
class ActionFlowAReadWithDelay : public ActionFlowA, public ActionRead, public ActionWithDelay
{
// implementation of the full flow of a read command with delay that does Flow A.
};
class ActionFlowBReadWithDelay : public ActionFlowB, public ActionRead, public ActionWithDelay {/*...*/};
//...
बेशक
, मैं आज्ञा का पालन करेंगे कि कोई भी 2 क्रिया (कार्रवाई वर्ग से इनहेरिट) एक ही विधि को लागू करेगा।
केस 2: मैं अपने सिस्टम में "कमांड" के लिए समग्र डिजाइन पैटर्न को लागू करता हूं। एक कमांड को पढ़ा, लिखा, हटाया जा सकता है, आदि। मैं भी कमांड का अनुक्रम प्राप्त करना चाहता हूं, जिसे पढ़ा, लिखा, हटाया जा सकता है आदि। आदेशों के अनुक्रम में आदेशों के अन्य अनुक्रम शामिल हो सकते हैं।
class CommandAbstraction
{
CommandAbstraction(){};
~CommandAbstraction()=0;
void Read()=0;
void Write()=0;
void Restore()=0;
bool IsWritten() {/*implemented*/};
// and other implemented functions
};
class OneCommand : public virtual CommandAbstraction
{
// implement Read, Write, Restore
};
class CompositeCommand : public virtual CommandAbstraction
{
// implement Read, Write, Restore
};
इसके अलावा, मैं आदेश, "आधुनिक" आदेशों की एक विशेष प्रकार का है:
तो मैं निम्नलिखित डिजाइन की है। एक कमांड और समग्र कमांड दोनों आधुनिक हो सकते हैं। "आधुनिक" होने के कारण गुणों की एक निश्चित सूची एक कमांड और समग्र कमांड (उनमें से दोनों के लिए अधिकतर गुण) में जोड़ती है। मैं कमांड एब्स्ट्रक्शन को पॉइंटर पकड़ने में सक्षम होना चाहता हूं, और आवश्यक प्रकार के कमांड के अनुसार इसे (नए के माध्यम से) प्रारंभ करना चाहता हूं।
class ModernCommand : public virtual CommandAbstraction
{
~ModernCommand()=0;
void SetModernPropertyA(){/*...*/}
void ExecModernSomething(){/*...*/}
void ModernSomethingElse()=0;
};
class OneModernCommand : public OneCommand, public ModernCommand
{
void ModernSomethingElse() {/*...*/};
// ... few methods specific for OneModernCommand
};
class CompositeModernCommand : public CompositeCommand, public ModernCommand
{
void ModernSomethingElse() {/*...*/};
// ... few methods specific for CompositeModernCommand
};
फिर, मुझे यकीन है कि कोई 2 वर्गों CommandAbstraction वर्ग से इनहेरिट एक ही विधि को लागू करेगा कर देगा: तो मैं निम्नलिखित डिजाइन करने के लिए (ऊपर के अलावा) चाहते हैं।
धन्यवाद।
हाय डेविड। मुझे उन्नत ओओपी (विरासत) विषयों को सीखने में दिलचस्पी है जैसा आपने अपने उपरोक्त पदों (मज़दूरों, आभासी कार्यों, आदि) के साथ उल्लेख किया है। क्या आप इस विषय पर किसी भी पुस्तक की सिफारिश कर सकते हैं? –
@ करलो डेल मुंडो: इस [प्रश्न] में पुस्तकों का एक अच्छा संग्रह है (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) मुझे विशेष रूप से अलेक्जेंड्रेस्कू पढ़ने का आनंद मिला (शुरुआती के लिए नहीं) और सटर। –