在這種情況下,你的類型本身是通用的。
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>();
}
}
但我不明白這門課的目的。 GridConfig方法具有設置DataGrid屬性(具有私有設置器)的非明顯副作用。如果我使用這個類,我永遠不會猜測GridConfig()返回給我的值也被設置爲DataGrid屬性。換句話說:
var configurator = new GridConfigurator();
var firstGrid = configurator.GridConfig();
var firstReference = configurator.DataGrid;
var secondGrid = configurator.GridConfig();
var secondReference = configurator.DataGrid;
我將承擔以下將返回false:
object.ReferenceEquals(firstGrid, secondGrid);
不過,我會以爲這將返回真:因爲在任何時候
object.ReferenceEquals(firstReference, secondReference);
上面的代碼是否曾經分配過DataGrid屬性。目前尚不清楚名爲GridConfig()的方法會產生這種效果。
使封閉類型(GridConfigurator)也似乎通用打敗你想要什麼樣的目的。爲什麼會有人使用這種類型,他們可以直接使用DataGridForm的直接引用呢?
如果GridConfig方法是應該做的事情不僅僅是分配DataGridForm的一個新的默認實例,然後使它成爲一個靜態工廠類是這樣的:
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;
}
}
我還要名字比其他方法的東西GridConfig。像Configure()或Create()。
你能不能把常用功能在接口'IDataGridForm'然後有屬性是此類型的? – Corak
我無法得到你,你能解釋更多細節嗎? – saber
那麼,你想如何使用DataGridForm呢?例如,我想你想要「顯示」一個表格。因此,使用Display()方法創建一個接口'IDataGridForm'。現在讓你的類'DataGridForm'實現該接口。它需要有'Display()'方法來做到這一點。現在有一個屬性'公共IDataGridForm DataGrid {get;私人設置; }'。這個屬性現在可以包含一個'DataGridForm ',你可以在任何你想要的地方顯示()。 –
Corak