繁体   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