मैं सिर्फ इसे बाहर फेंकना चाहता था कि कभी-कभी प्रतिनिधि इन समस्याओं को हल करते हैं, संदर्भ के आधार पर।
यदि आपको स्थैतिक विधि को किसी प्रकार के कारखाने या आरंभीकरण विधि के रूप में कॉल करने की आवश्यकता है, तो आप एक प्रतिनिधि की घोषणा कर सकते हैं और संबंधित जेनेरिक कारखाने के लिए स्थैतिक विधि को पारित कर सकते हैं या जो कुछ भी हो उसे इस "स्थैतिक विधि के साथ सामान्य वर्ग" की आवश्यकता है।
उदाहरण के लिए:
class Factory<TProduct> where TProduct : new()
{
public delegate void ProductInitializationMethod(TProduct newProduct);
private ProductInitializationMethod m_ProductInitializationMethod;
public Factory(ProductInitializationMethod p_ProductInitializationMethod)
{
m_ProductInitializationMethod = p_ProductInitializationMethod;
}
public TProduct CreateProduct()
{
var prod = new TProduct();
m_ProductInitializationMethod(prod);
return prod;
}
}
class ProductA
{
public static void InitializeProduct(ProductA newProduct)
{
// .. Do something with a new ProductA
}
}
class ProductB
{
public static void InitializeProduct(ProductB newProduct)
{
// .. Do something with a new ProductA
}
}
class GenericAndDelegateTest
{
public static void Main()
{
var factoryA = new Factory<ProductA>(ProductA.InitializeProduct);
var factoryB = new Factory<ProductB>(ProductB.InitializeProduct);
ProductA prodA = factoryA.CreateProduct();
ProductB prodB = factoryB.CreateProduct();
}
}
दुर्भाग्य से आप यह लागू नहीं कर सकते हैं कि कक्षा में सही विधि है, लेकिन आप कम से कम संकलन-समय लागू कर सकते हैं कि परिणामी फ़ैक्टरी विधि में वह सब कुछ है जिसकी वह अपेक्षा करता है (यानी बिल्कुल सही हस्ताक्षर के साथ एक आरंभीकरण विधि)। यह रन टाइम रिफ्लेक्शन अपवाद से बेहतर है।
इस दृष्टिकोण के कुछ लाभ भी हैं, यानी आप init के तरीकों का पुन: उपयोग कर सकते हैं, उदाहरण के तरीके, आदि हो सकते हैं।