Trong trường hợp này, chính loại của bạn phải là loại chung.
class GridConfigurator<TData, TGrid>
where TData : class
{
public DataGridForm<TData, TGrid> DataGrid { get; private set; }
public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>()
{
return DataGrid = new DataGridForm<TData, TGrid>();
}
}
Nhưng tôi không hiểu mục đích của lớp học này. Phương thức GridConfig có một tác dụng phụ không rõ ràng của việc thiết lập thuộc tính DataGrid (có một setter riêng). Nếu tôi đang sử dụng lớp này, tôi sẽ không bao giờ đoán rằng giá trị GridConfig() trả về cho tôi cũng được đặt làm thuộc tính DataGrid. Nói cách khác:
var configurator = new GridConfigurator();
var firstGrid = configurator.GridConfig();
var firstReference = configurator.DataGrid;
var secondGrid = configurator.GridConfig();
var secondReference = configurator.DataGrid;
tôi sẽ giả định sau đây sẽ trả về false:
object.ReferenceEquals(firstGrid, secondGrid);
Nhưng tôi sẽ giả định này sẽ quay trở lại đúng:
object.ReferenceEquals(firstReference, secondReference);
Bởi vì tại không có điểm trong mã trên tôi đã bao giờ gán thuộc tính DataGrid. Nó không phải là rõ ràng rằng một phương pháp gọi là GridConfig() sẽ có hiệu lực đó.
Tạo kiểu kèm theo (GridConfigurator) cũng có vẻ chung chung để đánh bại mục đích của những gì bạn đang cố gắng. Tại sao bất cứ ai sử dụng loại này khi họ chỉ có thể sử dụng một tham chiếu trực tiếp đến DataGridForm thay thế?
Nếu phương pháp GridConfig là phải làm một cái gì đó nhiều hơn chỉ là gán một trường hợp mặc định mới của DataGridForm, sau đó làm cho nó một lớp nhà máy tĩnh như thế này:
static class GridConfigurator
{
public static DataGridForm<TData,TGrid> GridConfig<TData, TGrid>(...) where TData: class
{
var grid = new DataGridForm<TData,TGrid>();
// do something with the parameters to this method to initialize the instance.
return grid;
}
}
Tôi cũng sẽ đặt tên cho phương pháp một cái gì đó khác hơn GridConfig. Giống như Configure() hoặc Create().
Bạn không thể đặt chức năng chung trong Giao diện 'IDataGridForm' và sau đó có thuộc tính thuộc loại đó? – Corak
Tôi không thể giúp bạn, bạn có thể giải thích chi tiết hơn không? – saber
Vâng, bạn muốn * sử dụng * 'DataGridForm' như thế nào? Ví dụ, tôi tưởng tượng bạn muốn 'hiển thị' một biểu mẫu. Vì vậy, hãy tạo một giao diện 'IDataGridForm' với phương thức' Display() '. Bây giờ hãy để lớp của bạn 'DataGridForm' thực hiện giao diện đó. Nó cần phải có phương thức 'Display()' để làm điều đó. Bây giờ có một thuộc tính 'public IDataGridForm DataGrid {get; bộ tư nhân; } '. Thuộc tính này bây giờ có thể chứa một 'DataGridForm ' và bạn có thể 'Hiển thị()' nó bất cứ nơi nào bạn muốn. –
Corak