2010-07-27 15 views
6

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

public class A 
{ 

} 

public class B 
{ 
    //constructor? 
    public B(A a) 
    { 
     //set b's properties from a 
    } 

    //factory method? 
    public static B FromA(A a) 
    { 
     B b = new B(); 
     //set b's properties from a 
     return b; 
    } 

    //setter method? 
    public static void SetBFromA(B b, A a) 
    { 
     //set b's properties from a 
    } 

    //assignment method? 
    public void AssignFrom(A a) 
    { 
     //set b's properties from a 
    } 
} 

//static helper class? 
public static class BHelper 
{ 
    public static B GetBFromA(A a) 
    { 
     B b = new B(); 
     //set b's properties from a 
     return b; 
    } 

    public static void SetBFromA(B b, A a) 
    { 
     //set b's properties from a 
    } 
} 

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

धन्यवाद!

उत्तर

2

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

//constructor? 
public B(A a) 
{ 
    //set b's properties from a 
} 

निर्माता पैटर्न विकल्प जब बी ए से डेटा बिना नहीं हो सकता

//factory method? 
public static B FromA(A a) 
{ 
    B b = new B(); 
    //set b's properties from a 
    return b; 
} 

कारखाने विधि पसंद का पैटर्न होगा जब मूल्यों बी हो जाता है में मूल्यों पर निर्भर हैं होगा ए या बी। खासकर यदि बी में वंशज हैं कि ए में एक मूल्य निर्माण का विकल्प प्रदान करेगा।

//setter method? 
public static void SetBFromA(B b, A a) 
{ 
    //set b's properties from a 
} 

सेटर विधि अपने परिदृश्य में लागू नहीं के रूप में इस जब ए और बी एक दूसरे के पता नहीं है और एक तीसरी पार्टी मध्यस्थता करने की जरूरत है इस्तेमाल किया जाएगा होगा।

//assignment method? 
public void AssignFrom(A a) 
{ 
    //set b's properties from a 
} 

यह अनिवार्य रूप से एक आगंतुक पैटर्न है। एक दौरे बी और खुद कुछ छोड़ देता है (स्नातक दिनों के बारे में सोचता है)। यह बी का विकल्प होगा यदि ए से डेटा बी

+0

उत्कृष्ट प्रतिक्रिया। मुझे प्रत्येक सुझाव के साथ-साथ प्रत्येक के लिए महान नियम-अंगूठे के बारे में टिप्पणी पसंद है। यह वही है जो मैं प्राप्त करने की उम्मीद कर रहा था। धन्यवाद! – bwerks

+0

* ब्लश * - धन्यवाद। –

3

मैं या तो कन्स्ट्रक्टर विधि या स्पष्ट रूपांतरण का उपयोग करता हूं।

public static explicit operator B(A typ) 
{ 

} 

सामान्यतः, मुझे लगता है कि यह बहुत ही व्यक्तिपरक है। हम सभी अलग-अलग विधि के साथ एक उत्तर पोस्ट कर सकते हैं और देख सकते हैं कि सबसे ज्यादा किसने वोट दिया है, लेकिन वास्तव में हर तरह के अलग-अलग लाभ और कमियां हैं। यह संदर्भ पर अधिक निर्भर करेगा और यह पैटर्न शेष कोड के दौरान कैसे किया जाता है।

+0

स्पष्ट रूपांतरण है जो मैं सोच रहा था .. –

+0

क्या यह विधि 'ए' या' बी' में जाएगी? –

+0

@ स्टेवन सूडिट बी –

0

मुझे नहीं लगता कि इस तरह की एक आम प्रथा है। जब मैंने ऐसा किया है तो मैंने कारखाने या कन्स्ट्रक्टर विधि का उपयोग किया है। मैं शायद कारखाने का पक्ष लेगा।

+0

मैं मुख्य रूप से कन्स्ट्रक्टर पर कारखाने का पक्ष लेता हूं क्योंकि मैं एक कलाकार के रूप में देखने से बचने की कोशिश कर रहा हूं। –

3

मैं एक विकल्प के बाहर टॉस होगी:

public static B CreateFromA(A a) { } 

यह एक कारखाने सिंटैक्स का उपयोग करता, जो बताते हैं कि यदि आप एक B एक A दिया बाहर क्रैंक कर सकते हैं, लेकिन यह एक रूपांतरण की तरह दिखता है कुछ भी परहेज।

+0

उन्होंने पहले से ही प्रश्न में एक फैक्ट्री विधि का सुझाव दिया है। लेकिन नाम में 'बनाएँ' रखने के लिए +1। –

+0

@ मार्क: यह यूरी की सिफारिश के विकल्प के रूप में था। मुझे पता है कि यह पूरी तरह से एकजुट है। बर्वक्स के अलावा, ग्रांट ने मुझे मार दिया। –

+0

हाँ, लेकिन आपने इसे जीतने से बेहतर लिखा है! फिर भी आपको प्रतिनिधि नहीं दे रहा है .. –

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