मैंने पहली बार एक सहकर्मी को ऐसा किया जब उसने ऑब्जेक्ट पूल लागू किए। उन्होंने कक्षा को पारित किया जो कि सामान्य आधार वर्ग के पैरामीटर के रूप में पूल किया जा रहा था। इस बेस क्लास ने पूलिंग कोड डाला।क्या एक वर्ग को सामान्य आधार वर्ग बुराई के पैरामीटर के रूप में खुद को पास करना है?
अजीब चीज यह है कि बेस क्लास अपने बच्चों के बारे में जान जाएगी। यह हर सामान्य मामले में बुरा अभ्यास माना जाता है। लेकिन इस मामले में माता-पिता दोहराव कोड लिखने से बचने के लिए सिर्फ एक तकनीकी समाधान है। किसी भी अन्य कोड द्वारा बेस क्लास का संदर्भ कभी नहीं दिया जाता है।
इस निर्माण के साथ एक दोष यह है कि यह "बेस क्लास जलता है"। आप पदानुक्रम के बीच में जेनेरिक बेस क्लास पेश नहीं कर सकते हैं। यह समस्या विषय के बाहर हो सकती है।
public abstract class Singleton<T> where T : class
{
public static T Instance { get; private set; }
public Singleton()
{
if (Instance != null)
throw new Exception("Singleton instance already created.");
Instance = (T) (object) this;
}
}
public class MyClass : Singleton<MyClass>
{
}
बेहतर कोड:
नीचे एक विचारणीय उदाहरण है
public abstract class Singleton<T> where T : Singleton<T>
{
public static T Instance { get; private set; }
public Singleton()
{
if (Instance != null)
throw new Exception("Singleton instance already created.");
Instance = (T) this;
}
}
public class MyClass : Singleton<MyClass>
{
}
आप उस अंतिम वाक्य के साथ अपना मन उड़ा रहे हैं। कक्षा सिंगलटॉन जहां टी: सिंगलटन ? क्या आपको अंतहीन रिकर्सिव जाने की आवश्यकता नहीं होगी (प्रत्येक टी को सिंगलटन होना होगा, जहां वह टी फिर से सिंगलटन इत्यादि) –
Kristof
जोड़ा गया स्लैक्स कोड सुधार। पहली पंक्ति आपके सिर स्पिन बनाती है। –
@ क्रिस्टोफ उदाहरण देखें: 'सार्वजनिक MyClass: सिंगलटन 'ऊपर।प्रकार, 'MyClass' IS-A' सिंगलटन 'इसलिए यह काम करता है। यद्यपि यह अभी भी थोड़ा मस्तिष्क-गंदा है। –