SO में कुछ दिनों पहले पूछे गए निम्नलिखित प्रश्न के आधार पर: GetType () और बहुरूपता और एरिक लिपर्ट के उत्तर को पढ़ते हुए , मैंने यह सोचना शुरू कर दिया कि क्या GetType()आभासी होना वास्तव में सुनिश्चित नहीं है कि कोई वस्तु इसके बारे में झूठ नहीं बोल सकतीType ।
विशेष रूप से, एरिक का जवाब निम्नलिखित बताता है:
फ्रेमवर्क डिज़ाइनर एक अविश्वसनीय रूप से खतरनाक विशेषता को जोड़ने नहीं जा रहे हैं जैसे कि किसी वस्तु को उसके प्रकार के बारे में झूठ बोलने की अनुमति देना केवल उसी प्रकार के तीन अन्य तरीकों के अनुरूप बनाना।
अब सवाल यह है: मैं एक उद्देश्य यह है कि कर सकते हैं करता है इसे तुरंत स्पष्ट किया जा रहा बिना अपने प्रकार के बारे में झूठ? मैं गहराई से यहाँ गलत हो सकता हूँ और अगर यह मामला है, तो मुझे स्पष्टीकरण पसंद आएगा, लेकिन निम्नलिखित कोड पर विचार करें:
public interface IFoo
{
Type GetType();
}
और उक्त इंटरफ़ेस के निम्नलिखित दो कार्यान्वयन:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
यदि आप निम्न सरल प्रोग्राम चलाते हैं:
static void Main(string[] args)
{
IFoo badFoo = new BadFoo();
IFoo niceFoo = new NiceFoo();
Console.WriteLine("BadFoo says he's a '{0}'", badFoo.GetType().ToString());
Console.WriteLine("NiceFoo says he's a '{0}'", niceFoo.GetType().ToString());
Console.ReadLine();
}
यकीन है कि पर्याप्त badFooएक गलत आउटपुट देता है Type।
अब मुझे नहीं पता कि क्या एरिक के इस व्यवहार को " अविश्वसनीय रूप से खतरनाक विशेषता " के रूप में बताने के आधार पर इसका कोई गंभीर प्रभाव है , लेकिन क्या यह पैटर्न एक विश्वसनीय खतरा पैदा कर सकता है?
IFoo.GetTypeऔर object.GetTypeएक ही बात नहीं है इसलिए खराब शैली के अलावा यहां कुछ भी बुरा नहीं हो रहा है। संपादित करें: आम तौर GetTypeपर कुछ मामलों में संकलित समय पर नहीं जाना जाता है, ज्यादातर मामलों में objectऔर कुछ डॉगी इंटरफ़ेस नहीं कहा जाएगा। :)
GetType। यह उस GetTypeविधि से संबंधित नहीं है जो महत्वपूर्ण है। आप एक सार्वजनिक उदाहरण विधि भी बना सकते हैं, जो संबंधित GetTypeपद्धति को newसंशोधित करती है , संशोधक कीवर्ड का उपयोग करके । ध्यान दें, यदि आपके पास एक सामान्य विधि है जैसे static Type Test<T>(T t) { return t.GetType(); }(बिना किसी बाधा के T), तो सामान जैसी सामग्री Test<IFoo>(new BadFoo())अभी भी मूल GetTypeविधि कहेगी।