2010-04-20 19 views
9

एक सामान्य बाधा घोषित करने के लिए मेरे पास दो सामान्य सार प्रकार हैं: Entity और Associationसामान्य जेनेरिक

मान लीजिए कि Entity इस तरह दिखता है:

public class Entity<TId> 
{ 
//... 
} 

और Association इस तरह दिखता है:

public class Association<TEntity, TEntity2> 
{ 
//... 
} 

मैं एसोसिएशन कैसे विवश करते हैं ताकि वे किसी भी इकाई का हो सकता है?

मैं पालन करते हुए इसे पूरा कर सकते हैं:

public class Association<TEntity, TId, TEntity2, TId2> 
    where TEntity : Entity<TId> 
    where TEntity2: Entity<TId2> 
{ 
//... 
} 

यह बहुत कठिन अधिक प्रकार Association से निकाले जाते हैं के रूप में हो जाता है, क्योंकि मैं टीआईडी ​​और TId2 नीचे गुजर रखना है। क्या बाधा को दूर करने के अलावा, ऐसा करने का कोई आसान तरीका है?

उत्तर

11

यह समस्या आम तौर पर आपके सामान्य वर्ग (Entity<TId>, इस मामले में) को सामान्य गैर-जेनेरिक कक्षा से प्राप्त करने के द्वारा हल की जाती है।

public abstract class EntityBase 
{ 

} 

public class Entity<TId> : EntityBase 
{ 

} 

यह आपको करने की अनुमति देगा:

public class Association<TEntity, TEntity2> 
    where TEntity : EntityBase 
    where TEntity2 : EntityBase 
{ 

} 

संपादित

तो उन्हें एक सामान्य वर्ग से विरासत होने एक मुद्दा है, तो यह आसानी से के रूप में एक इंटरफेस के साथ किया जा सकता है कुंआ।

+0

बहुत अच्छा !! +1। – Nayan

+0

हाँ, मैं पहले ही इस निष्कर्ष पर पहुंचा हूं कि एक इंटरफ़ेस मेरी आवश्यकताओं के अनुरूप होगा, सिवाय इसके कि मुझे गैर-सामान्य आधार के लिए अपने इंटरफेस को समायोजित करने की आवश्यकता है! मैं उम्मीद कर रहा था कि एक साफ भाषा चाल होगी, लेकिन हां ... – HackedByChinese

+0

@ हैकडबीचिनिस: मुझे यकीन है कि यह कुछ ऐसा जोड़ा जा सकता है, लेकिन यह देखते हुए कि एक मौजूदा कामकाज है जो सरल और 100% प्रभावी है (बिना किसी बलिदान के कार्यक्षमता), शायद यह संभावना नहीं है कि हम जल्द ही किसी भी समय 'TENTITY ' जैसी कुछ भी देखेंगे;) –

0

Id प्रकार Association परिभाषा के अंदर महत्वपूर्ण हैं, तो आप एक संलग्न "संदर्भ" बना सकते हैं:

public static partial class EntityIds<TId1, TId2> { 

    public class Association<TEntity1, TEntity2> 
     where TEntity1 : Entity<TId1> 
     where TEntity2 : Entity<TId2> 
    { 
     // ... 
    } 

} 

इस तरह, Association वर्ग घोषणा अभी भी सुगम है, और इसके लिए आवश्यक प्रकार तर्क को बरकरार रखे हुए इसके प्रकार पैरामीटर।

एक कारखाने विधि सामान्य मामले के साथ मदद कर सकता है:

public static class AssociationFactory { 
    public static EntityIds<TId1, TId2>.Association<Entity<TId1>, Entity<TId2>> Create<TId1, TId2>(/*params...*/) { 
    return new EntityIds<TId1, TId2>.Association<Entity<TId1>, Entity<TId2>>(/*params...*/); 
    } 
} 

ऐसा नहीं है कि बहुत ज्यादा की तरह दिखता है, और यदि आप इकाई विशेषज्ञताओं की जरूरत नहीं है, आप यह संबद्धता अलग ढंग से मॉडल सकता है:

public class Association<TId1, TId2> 
{ 
    // ... 
    Entity<TId1> Entity1 { get; set; } 
    Entity<TId2> Entity2 { get; set; } 
    // ... 
} 
संबंधित मुद्दे