这是对泛型的滥用吗?

Is this an abuse of generics?

有时我发现自己处于一种情况,我想表达一种类型,它是内置 class 的子类型(例如 Wiforms 控件)并且还实现了自定义接口。我有几个这样的 classes,它们彼此之间没有关系。我在这些情况下使用泛型。这是一个简化的例子:

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 在此示例中指出的那样,将名称 属性 添加到界面将使这不是问题。让我再举一个例子:

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

请注意,添加基数 class 有时是不可能的。例如:

可能有一个自定义 class subclassing TreeNode 和另一个 subclassing DataGridView

不,不是。泛型用于创建泛型容器等这一事实并不意味着那是泛型的唯一用例。

在这种情况下,由于您的方法对实现通用接口的不同类型执行相同的操作,因此完全没问题,不是滥用。

虽然这不是更好的方法,但编写 getDescription 方法的另一种方法是编写一个将 Control 或 IDescription 作为输入的非泛型方法,并执行动态转换以获得实例视图不同的数据类型。但是,现在任何类型错误都将在 运行 时发生,而不是在编译时发生。如果你确定所有 IDescription 也是控件,它就可以工作。

另一种选择是在 IDescription 中添加名称 属性,并且仅使用 IDescription。