簡體   English   中英

這是濫用泛型嗎?

[英]Is this an abuse of generics?

我有時會發現自己處於一種情況,我想表達一種類型,它是一個inbuild類的子類型(例如Wiforms控件),並且還實現了一個自定義接口。 我有幾個這樣的類,否則彼此沒有關系。 我在這些情況下使用泛型。 這是一個簡化的例子:

interface IDescription
{
  string GetDescription();
}

...

private string getDescription<T>(T control) where T : System.Windows.Forms.Control, IDescription
{
  return control.Name + control.GetDescription();
}

然而,這似乎是泛型的一點點非常規使用,因為泛型通常用於編寫類型不可知代碼(如通用容器)。 另一方面,在此代碼中使用泛型僅僅是因為缺乏足夠的類型表達式。

我的問題是:這是濫用仿制葯嗎? 有沒有更好的方法來編寫這樣的代碼?

更新1

正如Frank Hileman在這個例子中指出的那樣,將Name屬性添加到接口會使這成為一個非問題。 讓我再舉一個例子:

private string getDescription<T>(T control) where T : System.Windows.Forms.Control, IDescription
{
  return getData(control) + control.GetDescription();
}

private string getData(System.Windows.Forms.Control control)
{
  ...
}

更新2

請注意,有時無法添加基類。 例如:

可能有一個自定義類子類TreeNode和另一個子類化DataGridView

不它不是。 泛型用於創建通用容器等的事實並不意味着這是泛型的唯一用例。

在這種情況下,由於您的方法對實現公共接口的不同類型執行相同的操作,因此它完全正常並且不是濫用。

雖然這不是更好的方法,但編寫getDescription方法的另一種方法是編寫一個非泛型方法,將Control或IDescription作為輸入,並執行動態轉換以獲取實例上的視圖作為不同的數據類型。 但是,現在任何類型錯誤都將在運行時而不是在編譯時發生。 如果您確定所有IDescription也是控件,它將起作用。

另一種選擇是將Name屬性放在IDescription中,並僅使用IDescription。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM