Мені просто хотілося це викинути, щоб іноді делегати вирішували ці проблеми залежно від контексту.
Якщо вам потрібно називати статичний метод як якийсь фабричний або ініціалізаційний метод, то ви можете оголосити делегата та передати статичний метод відповідному загальному заводу або будь-якому іншому, що потребує цього "загального класу за допомогою цього статичного методу".
Наприклад:
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, використовувати їх, наприклад, методи екземплярів тощо.