我有一个基类,它定义了一个像这样的泛型方法:
public class BaseClass
{
public T DoSomething<T> ()
{ ... }
}
由于这个类是由第三方提供的并且没有接口,我正在定义一个接口,该接口定义了该类中实际需要的方法。这样我就得到了松耦合,实际上可以用其他东西交换那个第三方类。对于此示例,请考虑以下接口:
public interface ISomething
{
T DoSomething<T> ()
where T : Foo;
}
如您所见,它定义了相同的方法,但也对类型参数应用了类型约束,这来自与此无关的一些其他要求。
接下来,我定义了一个子类型,BaseClass
它也实现了ISomething
. 此类将用作接口背后的常用实现——而接口将是应用程序的其余部分将访问的内容。
public class Something : BaseClass, ISomething
{
// ...
}
由于DoSomething
inBaseClass
已经支持任何类型参数T
,它应该特别支持类型参数,它是 的子类型Foo
。所以人们会期望一个子类型BaseClass
已经实现了接口。但是我收到以下错误:
方法“BaseClass.DoSomething()”的类型参数“T”的约束必须匹配接口方法“ISomething.DoSomething()”的类型参数“T”的约束。考虑改用显式接口实现。
现在,我有两种可能;第一个是做错误提示的事情并明确地实现接口。第二个是使用隐藏基本实现new
:
// Explicit implementation
T ISomething.DoSomething<T> ()
{
return base.DoSomething<T>();
}
// Method hiding
public new T DoSomething<T>()
where T : Foo
{
return base.DoSomething<T>();
}
两者都有效,尽管我可能更喜欢第二种解决方案来保持该方法可以从类本身访问。但是它仍然留下以下问题:
当基类型已经使用不太严格(读取:无)类型约束实现它时,为什么我必须重新实现该方法?为什么该方法需要完全按原样执行?
编辑:为了赋予该方法更多意义,我将返回类型从 更改void
为T
。在我的实际应用程序中,我有通用参数和返回值。