2010-02-15 19 views
16

वर्तमान में मेरे पास कई परियोजनाओं का समाधान है जो अधिकतर कक्षाओं का उपयोग करते हैं। नतीजतन, यह मुझे दिखाई दिया कि प्रत्येक प्रोजेक्ट में कक्षा को दोहराने के बजाय समाधान में इन वर्गों वाली कक्षा पुस्तकालय को जोड़ना एक अच्छा विचार होगा।सी # आंशिक वर्ग

हालांकि, एक परियोजना के लिए मुझे कुछ परियोजनाओं के लिए कुछ अतिरिक्त गुणों की आवश्यकता है जो उस परियोजना के लिए विशिष्ट हैं और कहीं और नहीं उपयोग किए जाएंगे। नतीजतन, मैंने सोचा कि मुझे इन गुणों को जोड़ने के लिए आंशिक कक्षाओं का उपयोग करना चाहिए। कुछ तो मैंने किया है इस तरह:

वर्ग पुस्तकालय में:

namespace MyClassLibrary 
{ 
    public partial class Book 
    { 
     public string Title { get; set; } 
     public string AuthorLast { get; set; } 
     public string AuthorFirst { get; set; } 
     public string Publisher { get; set; } 
     public string Edition { get; set; } 
     public string ISBN10 { get; set; } 
     public string ISBN13 { get; set; } 
    } 
} 

परियोजना में (MyProject):

namespace MyClassLibrary 
{ 
    public partial class Book 
    { 
     public string AdditionalProperty { get; set; } 
    } 
} 

मैं MyProject में MyClassLibrary संदर्भित किया है (एक सी # खिड़कियों फार्म एप्लिकेशन), हालांकि जब मैं इस वर्ग को कोडबेंड में फॉर्म के लिए उपयोग करने का प्रयास करता हूं तो मुझे निम्न त्रुटि मिलती है:

class MyClassLibrary.Book

Warning: The type 'MyClassLibrary.Book' in 'C:... (Project)' conflicts with the imported type 'MyClassLibrary.Book' in 'C:... (Class Library DLL)'. Using the type defined in 'C:...(project)'.

कोई विचार क्या मैं गलत कर रहा हूं या यदि मेरा पूरा दृष्टिकोण खराब है और मुझे कुछ और करना चाहिए?

उत्तर

20

partials विधानसभाओं में फैले के लिए नहीं हैं। ,

public class MyFoo 
{ 
    public string BasicProperty {get;set;} 
} 

public class MySpecificFoo : MyFoo 
{ 
    public string AnotherProperty {get;set;} 
} 

अपनी परियोजना में MyFoo के अधिक विशिष्ट प्रकार की आवश्यकता होती है बजाय MySpecificFoo का उपयोग: आप उपयोग के एक अधिक विशिष्ट प्रकार के लिए अपनी कक्षा में जोड़ने की जरूरत है, तो आप एक व्युत्पन्न वर्ग बनाना चाहिए। चूंकि यह MyFoo से प्राप्त/प्राप्त होता है, इसके अतिरिक्त अतिरिक्त गुणों के साथ, MyFoo की सभी गुण और कार्यक्षमता भी होगी। यह Polymorphism का हिस्सा है, जहां ओओपी की असली शक्ति है।

+0

धन्यवाद! मैं इसे व्युत्पन्न कक्षा के साथ आज़माउंगा ... अभी भी इस पर नया! – Andrew

+2

उह ... नहीं, इसे "विरासत" कहा जाता है! –

+0

@Steven तत्काल विवरण से स्पष्टता –

9

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

यहाँ इतने पर एक पूरी चर्चा इस बारे में बताया गया है: Should you use a partial class across projects?

+0

त्वरित उत्तर के लिए धन्यवाद। क्या आपके पास कोई विचार है कि इस मुद्दे को देखते हुए मैं कक्षाओं को कैसे व्यवस्थित कर सकता हूं? क्या मुझे सिर्फ परियोजनाओं में डुप्लिकेट करना चाहिए या क्लास लाइब्रेरी में कक्षा में संपत्ति को जोड़ना चाहिए, भले ही यह केवल एक परियोजना के लिए हो? संपादित करें: नीचे दिए गए अनुसार व्युत्पन्न कक्षाओं को आजमाने के लिए जा रहा हूं। धन्यवाद फिर से – Andrew

+1

मैं एक समाधान के लिए रेक्स के उत्तर के साथ जाऊंगा, कक्षाओं को विरासत में सबसे अच्छा दृष्टिकोण की तरह लगता है ... जब तक कोई कारण नहीं है, यदि हां, तो क्या अतिरिक्त प्रतिबंध है? –

+0

[उस लिंक किए गए प्रश्न पर स्कीट] से [http://stackoverflow.com/a/309944/1028230): 'आप परियोजनाओं में आंशिक कक्षा नहीं लिख सकते हैं। आंशिक वर्ग एक संकलन-समय-केवल सिंटेक्टिक चीनी का टुकड़ा है - पूरा प्रकार एक ही असेंबली में समाप्त होता है, यानी एक प्रोजेक्ट। – ruffin

1

जो आप करने की कोशिश कर रहे हैं, उसके लिए आपको बेस क्लास और विरासत का उपयोग करने की कोशिश करनी चाहिए। या बेहतर object composition

+0

के लिए संपादित किया गया है, संरचना निश्चित रूप से बेहतर समाधान –

+0

@Steven बिल्कुल नहीं है। मुझे लगता है कि यह इंगित करने में मददगार है क्योंकि कई नौसिखियां विरासत के बारे में जानें और फिर इसे हर जगह ** हर जगह ** परेशानी में डाल दें क्योंकि वे किसी भी बेहतर नहीं जानते हैं। –

0

मुझे लगता है कि आप जो हासिल करने की कोशिश कर रहे हैं उसके आधार पर यह अधिक है।

अपने सभी सामान्य वर्गों को कक्षा पुस्तकालय परियोजना में रखें और इसे एक डीएलएल में संकलित करें।

फिर आप बाह्य परियोजनाओं में डीएलएल का संदर्भ दे सकते हैं। बाहरी परियोजना के लिए आपको किसी भी संपत्ति को जोड़ने की आवश्यकता होती है, फिर आप कक्षा का उत्तराधिकारी बना सकते हैं और वहां संपत्ति जोड़ सकते हैं।

0

सभी गलत। आपको इसके बजाय आंशिक तरीकों पर विचार करना चाहिए। देखो ' वे वही हैं जो आपने मांगे थे।

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