2012-09-25 27 views
5

मैंने आज ही विरासत पर संरचना के बारे में कुछ सीखा। मैं सोच रहा था कि क्या मुझे हाल ही में लिखी गई किसी चीज़ को अवधारणा लागू करनी चाहिए।सार बेस या हेल्पर क्लास

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

class BallMillDBHandler{ 

    public BallMillDBHandler(){ ... } 

    public void InsertTool(BallMill tool) { ... } 
    public BallMill QueryTool(string toolID) { ... } 
    public void UpdateTool(BallMill tool) { ... } 
    public void DeleteTool(string toolID) { ... } 
} 

class DiamondToolDBHandler{ 

    public DiamondToolDBHandler(){ ... } 

    public void InsertTool(DiamondTool tool) { ... } 
    public DiamondTool QueryTool(string toolID) { ... } 
    public void UpdateTool(DiamondTool tool) { ... } 
    public void DeleteTool(string toolID) { ... } 
} 

मैं लगभग दोहराया तरीकों के बहुमत को लेकर उन्हें एक BaseToolDBHandler() वर्ग में बाहर पुनर्संशोधित, और अन्य दो से विरासत में मिला है, कुछ सार तरीकों प्रदान और डेटाबेस पैरामीटर को स्वयं एक्सेस करने में मतभेदों को संभालने के लिए गुण।

क्या यह BaseToolDBHandler डेटाबेस सहायक के भीतर निहित एक सहायक वर्ग बनाने के लिए समझ में आता है, और उन्हें पहले अमूर्त गुण/विधियों का एक सामान्य इंटरफ़ेस प्रदान करता है? या मुझे इसे विरासत के मामले के रूप में छोड़ देना चाहिए?

+5

यह मेरे लिए विरासत के लिए सही जगह की तरह लगता है, इसलिए मैं इसे इस तरह से छोड़ दूंगा। –

+0

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

उत्तर

3

यह एक ऐसे परिदृश्य की तरह दिखता है जो बेस क्लास/इंटरफ़ेस के माध्यम से जेनेरिक और विरासत दोनों को लाभान्वित करेगा।

class DBHandler<TTool> where TTool : ToolBase // or ITool 
{ 
    public DBHandler(){ ... } 

    public void InsertTool(TTool tool) { ... } 
    public TTool QueryTool(string toolID) { ... } 
    public void UpdateTool(TTool tool) { ... } 
    public void DeleteTool(string toolID) { ... } 
} 

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

उदाहरण:

var handler = new DBHandler<BallMill>(); 
BallMill value = handler.QueryTool("xyz"); 
value.SomeProperty = "New Value"; 
handler.UpdateTool(value); 
+1

ऐसा लगता है कि यह एक विकल्प हो सकता है, लेकिन यह उन तरीकों के अंदर क्या होता है इस पर निर्भर करेगा; वे काम करने के लिए पर्याप्त हो सकते हैं या नहीं भी हो सकते हैं। – Servy

+0

@ जैमीक वास्तव में। समझ गया। – Dan

+0

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

3

विरासत का अधिक उपयोग किया जाता है, लेकिन यह इसके लिए एक उचित मामला जैसा लगता है। कई मामलों में लोग सिर्फ डुप्लिकेट कोड देखते हैं और सोचते हैं "मैं बेस क्लास के माध्यम से डुप्लिकेट कोड को हटाने के लिए विरासत का उपयोग करूंगा।" हकीकत में, अधिकांश डुप्लिकेट कोड को पूरी तरह से किसी अन्य वर्ग में दोहराया जा सकता है जिसका उपयोग कई स्थानों पर किया जाता है। आम तौर पर इसका उपयोग करने वाले वर्ग "संबंधित" नहीं होते हैं, वे दो पूरी तरह से अलग-अलग चीजें कर रहे हैं और कुछ छोटे कार्यों (या कुछ श्रृंखला) को करने की आवश्यकता को साझा करने के लिए होता है।

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

+0

मुझे विरासत का उपयोग करने की आपकी परिभाषा पसंद आई - यह केवल कॉर्न नहीं है "एक" बनाम "एक परिभाषा है, लेकिन आप वास्तव में समझाते हैं कि कक्षाएं एक ही सामान्य लक्ष्य की सेवा करती हैं (और इसलिए उन्हें संदर्भित करने की आवश्यकता हो सकती है एक बहुरूप तरीके से इसलिए विरासत का उपयोग करने का एक अच्छा कारण है)। इसके अलावा विरासत से कोई वास्तविक लाभ नहीं है क्योंकि कोड पुन: उपयोग को विरासत के साथ होने वाले युग्मन और खतरों के बिना संरचना द्वारा हासिल किया जा सकता है। – BornToCode

0

मैं कहूंगा कि यह निश्चित रूप से विरासत के लिए एक काम है ... लेकिन सीधे पहले एक बात मिलता है। संरचना एक डिज़ाइन पैटर्न है जिसका उपयोग किया जा सकता है और इसका उपयोग किया जाना चाहिए जहां कक्षाओं की एकाधिक विरासत किसी दिए गए भाषा की विशेषता नहीं है (उदाहरण के लिए सी #)

संरचना का तात्पर्य है कि आपकी समग्र कक्षा कक्षाओं को तुरंत चालू करती है, जहां आमतौर पर उन्हें विरासत में प्राप्त किया जाता है। इस उदाहरण में, आप इंटरफेस के माध्यम से कार्यान्वयन के लिए अनुबंध प्रदान करते हैं।

आप कैसे विरासत अपने कोड लागू किया जा सकता का एक मोटा उदाहरण के लिए, इस पर विचार करें: (इस रचना का उपयोग नहीं कर रहा है)

public interface IHandler 
{ 
    void InsertTool(ITool tool); 
    void UpdateTool(ITool tool); 
    void DeleteTool(string toolID); 
    //void DeleteTool(ITool tool) - seems more consistent if possible!? 

    ITool QueryTool(string toolID); 
} 

public interface ITool 
{ 

} 

class BallMill : ITool 
{ 
} 

class DiamondTool : ITool 
{ 
} 

class BallMillDBHandler : IHandler 
{ 

    public BallMillDBHandler(){ ... } 

    public void InsertTool(ITool tool) { ... } 
    public BallMill QueryTool(string toolID) { ... } 
    public void UpdateTool(ITool tool) { ... } 
    public void DeleteTool(string toolID) { ... } 
} 

class DiamondToolDBHandler : IHandler 
{ 

    public DiamondToolDBHandler(){ ... } 

    public void InsertTool(ITool tool) { ... } 
    public DiamondTool QueryTool(string toolID) { ... } 
    public void UpdateTool(ITool tool) { ... } 
    public void DeleteTool(string toolID) { ... } 
} 
+0

'QueryTool' इंटरफ़ेस पर नहीं है, इस जवाब को अनावश्यक आईएमओ के रूप में बहुत अधिक आधार देता है। इंटरफ़ेस का कोई वास्तविक उपयोग नहीं है। – Jamiec

+0

@Jamiec ... एक संपादन के लिए समय ... – series0ne

0

बल्कि विरासत से, जेनरिक का उपयोग करें। आप विभिन्न प्रकार की वस्तुओं पर एक ही ऑपरेशन करना चाहते हैं, जो वास्तव में जेनेरिक सर्वोत्तम है।

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

  • कोई संबंधित समस्या नहीं^_^