Tôi chỉ muốn ném ra rằng đôi khi các đại biểu giải quyết những vấn đề này, tùy thuộc vào ngữ cảnh.
Nếu bạn cần gọi phương thức tĩnh dưới dạng một nhà máy hoặc phương thức khởi tạo nào đó, thì bạn có thể khai báo một ủy nhiệm và chuyển phương thức tĩnh cho nhà máy chung có liên quan hoặc bất kỳ phương thức nào cần "lớp chung với phương thức tĩnh này".
Ví dụ:
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();
}
}
Thật không may, bạn không thể thực thi rằng lớp có phương thức phù hợp, nhưng ít nhất bạn có thể biên dịch-thời gian-thực thi rằng phương thức gốc kết quả có mọi thứ mà nó mong đợi (tức là một phương thức khởi tạo với chính xác chữ ký phù hợp). Điều này tốt hơn một ngoại lệ phản ánh thời gian chạy.
Cách tiếp cận này cũng có một số lợi ích, tức là bạn có thể sử dụng lại các phương thức init, đặt chúng là phương thức thể hiện, v.v.