Ben sadece içeriğe bağlı olarak bazen delegelerin bu sorunları çözdüğünü ortaya koymak istedim.
Statik yöntemi bir tür fabrika veya başlatma yöntemi olarak çağırmanız gerekiyorsa, bir temsilci bildirebilir ve statik yöntemi ilgili genel fabrikaya veya bu "bu statik yöntemle genel sınıf" a ihtiyaç duyan her neyse, iletebilirsiniz.
Örneğin:
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();
}
}
Ne yazık ki, sınıfın doğru yönteme sahip olmasını zorlayamazsınız, ancak sonuçta ortaya çıkan fabrika yönteminin beklediği her şeye sahip olduğunu (yani, tam olarak doğru imzaya sahip bir başlatma yöntemi) en azından derleme-zamanı zorlayabilirsiniz. Bu, çalışma zamanı yansıtma istisnasından daha iyidir.
Bu yaklaşımın bazı faydaları da vardır, yani init yöntemlerini yeniden kullanabilir, örnek yöntemleri olmasını sağlayabilirsiniz, vb.