2012-07-03 22 views
8

मेरे पास एक श्रेणी/फ़ाइल वृक्ष संरचना है। दोनों श्रेणियों और फ़ाइलों में माता-पिता हो सकते हैं, इसलिए मैंने उन्हें एक सामान्य बेस क्लास से लिया है जिसमें एक मूल संपत्ति है। चूंकि सभी माता-पिता स्पष्ट रूप से हमेशा श्रेणियां होंगी (फाइलें माता-पिता नहीं हो सकती हैं), ऐसा लगता है कि नोड की मूल संपत्ति को श्रेणी नोड प्रकार बनाना है।क्या यह एक खराब प्रकार है जो व्युत्पन्न प्रकार को मूल प्रकार में संदर्भित करता है?

क्या बेस क्लास के लिए व्युत्पन्न कक्षा का संदर्भ देने के लिए यह खराब रूप है? यदि हां, तो क्यों? यदि ऐसा है, तो इसे ढांचा बनाने का एक बेहतर तरीका क्या है?

class Node { 
    public CategoryNode Parent {get; set;} 
} 

class File : Node { 
    ... 
} 

class CategoryNode : Node { 
    ... 
} 
+0

AFAIU, वे दोनों गुण साझा करने इतना ही पुनरावर्ती संदर्भ होने एकल वर्ग पर उपयोग क्यों नहीं के लिए एक ही आधार वर्ग का विस्तार? उन्हें अलग करने के लिए अतिरिक्त गुणों के साथ। –

+0

हाँ यह बुरा है। परिपत्र निर्भरता का कारण बनता है। आधार व्युत्पन्न के बारे में कुछ भी नहीं पता होना चाहिए। – Tilak

+0

@Furqan, फ़ाइल नोड अतिरिक्त सामान CategoryNode है कि, इस तरह के बच्चों के रूप में की जरूरत नहीं है, इसलिए मुझे नहीं लगता कि यह CategoryNode से निकाले जाते हैं चाहिए। – Kelsie

उत्तर

4

तो संपत्ति Parentवास्तव में सभी सन्तान का एक आम गुण और हमेशा की तरह CategoryNode है, यह एक समस्या नहीं है। अर्थात् यह सही और तकनीकी रूप से बोल रहा है, मुझे लगता है कि जैसे ही आप एक ही पुस्तकालय में रहते हैं (सर्कुलर संदर्भों से बचने के लिए)।

// BAD CODE 
if(myProp is subclassA) 
{ ... 
} 
else if (myProp is syubclassB) 
{ ... 
} 

इस कोड को बुरा है, आप ढीला क्योंकि विरासत का लाभ:

यह एक समस्या है जब आप इस तरह कोड लिखने हो सकता है।

यहां तक ​​कि नेट फ्रेमवर्क में ऐसी संरचनाएं हैं। मेरे दिमाग में आने वाला पहला उदाहरण XObject.Parent संपत्ति है।

XElement XObject विरासत में मिलता है, और XObject प्रकार XElement की एक संपत्ति प्रकाशित करता है। अपने स्निपेट के समान ही।

1

बेस क्लास को यह नहीं पता होना चाहिए कि इससे कौन निकला है।

यदि आपके पास ऐसा कोई मामला है, तो शायद आप विरासत नहीं चाहते हैं। आपको बस युग्मन के कुछ रूपों का उपयोग करना चाहिए।

फ़ाइल और श्रेणी नोड आपके मामले में एक नोड सदस्य होना चाहिए।

+0

मैं आपसे सहमत नहीं हो सकता। अगर माता-पिता हमेशा एक श्रेणी नोड है तो क्या होगा? यह बेस क्लास में एक समस्या हो सकती है जैसे 'if (myProp subclassA है) {...} और यदि (myProper syubclassB है) {...} '। ऐसी चीजें गंदे हैं। लेकिन नमूना नहीं है ओपी सुझाव –

+0

लेकिन यह नहीं है। हमने अभी देखा है कि अभिभावक फ़ाइल हो सकता है, जो कि श्रेणी नोड से जुड़ा हुआ नहीं है। –

+0

ओपी ने कहा कि 'फाइलें माता-पिता नहीं हो सकती हैं –

1

अन्य विकल्प श्रेणी श्रेणी को रूट श्रेणी (ए) बनाने के लिए कक्षा पदानुक्रम को बदलना होगा, या संपत्ति प्रकार को नोड (बी) में बदलना होगा।

इन दोनों संभावनाएं अच्छी नहीं हैं: (ए) फ़ाइल में सभी कार्यक्षमता श्रेणी नोड की आवश्यकता होगी जिसके लिए इसकी आवश्यकता नहीं है। (बी) यह ऑब्जेक्ट प्रकार छुपाएगा (जो हमेशा श्रेणी नोड होता है)। यह आपके कोड में कहीं और अमान्य कास्ट त्रुटियों का पालन कर सकता है। उदाहरण के लिए, यदि आप भूल जाते हैं तो हमेशा एक श्रेणी नोड उदाहरण होता है।

इस पर विचार करते हुए, मेरा मानना ​​है कि वर्तमान कोड ठीक है।

7

आप कर सकता है ...

interface IParent { 
    ... 
} 

class Node { 
    public IParent Parent {get; set;} 
} 

class File : Node { 
    ... 
} 

class CategoryNode : Node, IParent { 
    ... 
} 

इस तरह, आप आधार वर्ग में एक व्युत्पन्न वस्तु का उल्लेख करने,, आप वास्तव में एक माता पिता बन सकता है क्या में और अधिक लचीला कर रहे हैं की जरूरत नहीं है प्लस , यदि आप समय के बाद के बिंदु पर अतिरिक्त ऑब्जेक्ट प्रकार प्राप्त करते हैं। साथ ही, किसी भी कार्यक्षमता जो कि माता-पिता के लिए प्रासंगिक है, उस इंटरफ़ेस में घोषित की जा सकती है।

+0

शायद आप इंटरफ़ेस में जोड़ सकते हैं: 'IENumerable चाइल्ड नोड्स'? –

+0

@Steve यह एक डिजाइन सवाल है। निश्चित रूप से यह संभव है, लेकिन फिर मैं अब इंटरफ़ेस 'आईपैर' को कॉल नहीं करूंगा। ओपी एक मूल वस्तु को संदर्भित करना चाहता था, न कि बच्चे की वस्तु (सूची) के लिए। मेरे लिए यह अजीब लगता है कि 'आईनेमरेबल बच्चों' के रूप में घोषित कुछ ऐसा है, और व्यक्तिगत रूप से मैं कुछ और फिटिंग के लिए इंटरफ़ेस का नाम बदलूंगा ... यदि आपके पास उस तरह की नामकरण शैली के कई उदाहरण हैं, तो आप नरक के लिए सड़क पर फिर से IMHO ... – takrl

+0

आप सही हैं ... इससे भ्रम पैदा हो सकता है –

संबंधित मुद्दे