2010-01-15 20 views
5

यह "गृहकार्य-आश" और/या तुच्छ जैसा प्रतीत हो सकता है, लेकिन यह वास्तविक व्यापार उद्देश्य के लिए है; यह बस इतना आसान तरीका है कि मैं समझाने के बारे में सोच सकता हूं कि मैं क्या करने की कोशिश कर रहा हूं।बेस क्लास ऑब्जेक्ट्स की सूची से व्युत्पन्न प्रकारों की पहचान

मान लीजिए कि मेरे पास एक पशु वर्ग है, और कुछ अन्य वर्ग (पक्षी, बिल्ली, कंगारू) हैं। इनमें से प्रत्येक पशु से विरासत में मिलता है।

पशु इस प्रकार दिखाई देंगे:

public class Animal 
{ 
    public Animal() 
    { 

    } 

    public string Name { get; set; } 
    public string AnimalType { get; set; } 
    public List<Animal> Friends { get; set; } 
} 

कंगारू इस प्रकार दिखाई देंगे:

public class Kangaroo : Animal 
{ 
    public Kangaroo() 
    { 

    } 

    public int TailLengthInches { get; set; } 
} 

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

कारण I ऐसा करने की कोशिश कर रहा हूं कि जब मैं बाद में जानवर के "दोस्तों" की सूची प्राप्त करता हूं, तो यह जानना महत्वपूर्ण है कि मुझे पता है कि दोस्त किस प्रकार का पशु है। जानवर के प्रकार (चाहे वह पक्षी, बिल्ली, आदि) के आधार पर हो। मैं कुछ अलग करना चाहता हूं (वास्तव में एक एएसपी.नेट पेज पर एक अलग टेम्पलेट दिखाएं, लेकिन मुझे उस विशेष रूप से मदद की ज़रूरत नहीं है)

मुझे लगता है कि यह इस पर उबालता है ... अगर मेरे पास है पशु की एक सूची, मुझे कैसे पता चलेगा कि सूची में प्रत्येक ऑब्जेक्ट के लिए व्युत्पन्न प्रकार क्या था, इसलिए मैं उन्हें अपने व्युत्पन्न प्रकार पर वापस डाल सकता हूं या कुछ और कर सकता हूं मुझे प्रत्येक व्युत्पन्न प्रकार पर विशिष्ट, अलग-अलग गुणों को प्राप्त करने की अनुमति देता है?

धन्यवाद!

+1

टिप देख रहे हैं पर फिल्टर करने के लिए LINQ का उपयोग कर सकते हैं:, सही ढंग से प्रदर्शित संपादक में 101010 बटन का उपयोग करने कोड प्राप्त करने के लिए (या चार रिक्त स्थान से मांगपत्र) । – itowlson

उत्तर

7

आप प्रकार आप के लिए

animals.Friends = new List<Animal> { new Kangaroo(), new Bird() }; 
foreach (var kangaroo in animals.Friends.OfType<Kangaroo>()) { 
    kangaroo.Hop(); 
} 
+0

यह इसे संभालने का एक बहुत ही शानदार तरीका है। धन्यवाद! –

1

यह कास्टिंग का प्रयास करें:

var friendBird = friend as Bird; 
if (friendBird != null) 
{ 
    // It's a bird, so do something with it 
) 
+0

+1 ''' कीवर्ड का उपयोग करने के लिए 'है' कीवर्ड से जुड़े डबल कास्टिंग से बचने के लिए और फिर ऑब्जेक्ट कास्टिंग करने के लिए +1। –

1

आप typeof उपयोग कर सकते हैं वास्तविक प्रकार प्राप्त करने के लिए, या परीक्षण करने के लिए is या as ऑपरेटरों का उपयोग और वैकल्पिक रूप से डाली:

foreach (Animal a in Friends) 
{ 
    Kangaroo k = a as Kangaroo; 
    if (a != null) 
    { 
    // it's a kangaroo 
    k.JumpAround(); 
    } 
    Ostrich o = a as Ostrich; 
    if (o != null) 
    { 
    o.StickHeadInSand(); 
    } 
} 

(मैं नहीं है else क्लॉज का उपयोग किया जाता है, जो त्रुटियों का कारण बन सकता है यदि आप उन प्रकारों के खिलाफ परीक्षण कर रहे हैं जो पदानुक्रम में हो सकते हैं जैसे कि यदि आपके पास कंगारू और मंगल ग्रह के दोनों खंड थे, तो शायद आप दोनों को निष्पादित नहीं करना चाहते थे!)

तुम भी is ऑपरेटर, जो अच्छे लग रहा है के साथ ऐसा कर सकते हैं, लेकिन FxCop रोना कर देगा: वैसे

foreach (Animal a in Friends) 
{ 
    if (a is Kangaroo) 
    { 
    ((Kangaroo)a).JumpAround(); 
    } 
} 

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

0

'है' कीवर्ड का उपयोग करें।

यदि (पक्षी पक्षी है) ...

0
animals.Friends = new List<Animal> { new Kangaroo(), new Bird() }; 
foreach (Animal animal in animals.Friends) 
{ 
if (animal is Kangaroo) 
Console.WriteLine("Kangaroo"); 
else if (animal is Bird) 
Console.WriteLine("Bird"); 
} 
संबंधित मुद्दे