2009-09-09 12 views
5

ठीक है, कि शीर्षक एक छोटे से स्पष्ट नहीं है, लेकिन मुझे लगता है, यह डाल तक समझाते अन्य के लिए एक बेहतर तरीका नहीं सोच सकते हैं ...क्या विरासत स्थाई विधि में कक्षा संदर्भ का पता लगाना संभव है?

मैं एक वर्ग Animal, एक स्थिर, सामान्य विधि के साथ है कहते हैं:

public static T Create<T>() where T : Animal { 
    // stuff to create, initialize and return an animal of type T 
} 

और मैं उपवर्गों Dog, Cat है, Hamster आदि के लिए एक Dog पाने के लिए, मैं लिख सकते हैं:

Dog d = Animal.Create<Dog>(); 

ओ आर

Dog d = Dog.Create<Dog>(); 

जो वास्तव में वही बात है। लेकिन ऐसा लगता है कि Dog लिखना बहुत मूर्खतापूर्ण है, क्योंकि मैं पहले से ही Dog सबक्लास के माध्यम से स्थैतिक विधि का आह्वान कर रहा हूं।

आप आधार वर्ग में एक Create() विधि लेखन के किसी भी चालाक रास्ता के बारे में सोच सकते हैं, ताकि मैं उपवर्गों में से प्रत्येक में एक Create() विधि लिखे बिना

Dog d = Dog.Create(); 
Cat c = Cat.Create(); 
Hamster h = Hamster.Create(); 

आह्वान सकता है?

उत्तर

10

आप पशु वर्ग जेनेरिक बना सकते हैं।

class Animal<T> where T : Animal<T> 
{ 
    public static T Create() 
    { 
     // Don't know what you'll be able to do here 
    } 
} 

class Dog : Animal<Dog> 
{ 

} 

लेकिन यह कैसे Animal वर्ग जानता है व्युत्पन्न प्रकार के उदाहरण बना करने के लिए कैसे?

+2

आप शायद 'टी' जानवरों को प्रतिबंधित करना चाहते हैं: 'कक्षा पशु जहां टी: पशु ' – dtb

+0

@ डीटीबी: ज़रूर! प्रतिक्रिया अद्यतन, धन्यवाद। –

+0

बनाएँ() के अंदर कोड वर्चुअल/अमूर्त तरीकों को कॉल करेगा, इस प्रकार यह व्युत्पन्न प्रकारों के उदाहरण बनाएगा। –

2

मैं पशु वर्ग सार को स्थैतिक बनाएं विधि के साथ बना दूंगा; यह प्रभावी रूप से एक कारखाने के लिए एक प्रारंभिक बिंदु है। वास्तव में, ऐसा लगता है कि आप फैक्ट्री क्लास को पूर्ववत कर रहे हैं।

आप पशु वर्ग के लिए एक सार प्रारंभ विधि जोड़ते हैं, तो बनाएं विधि हो जाता है:

public static T Create<T>() where T : Animal { 
    T animal = new T(); //may need a "new" in the declaration 
    animal.Initialize(); //or Create or whatever or you put this logic 
         // in the constructor and don't call this at all. 
    return animal; 
} 
+0

पशु नहीं कर सकते एक स्थिर वर्ग बनें।हालांकि, यदि आप प्रत्येक व्युत्पन्न प्रकारों को सृजन का प्रतिनिधि बनाना चाहते हैं, तो पशु अमूर्त बनाने के लिए एक अच्छा विचार हो सकता है, और विधि वर्चुअल के बजाय सार प्रारंभ करें। –

+0

अच्छा पकड़ो। वह इरादा नहीं था। –

+0

@ रोमेन - अच्छी तरह से रखो, मैंने अपना जवाब समायोजित कर दिया है। –

1

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

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

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