是否有任何理由在实现类的方法名称之前包含接口引用?例如,假设您有一个ReportService:IReportService和一个GetReport(int reportId)方法.我正在审查一些代码,另一个开发人员在ReportService中实现了这样的方法:
Report IReportService.GetReport(int reportId)
{
//implementation
}
Run Code Online (Sandbox Code Playgroud)
我以前从未见过像这样的服务实现.它有用吗?
Ren*_*ogt 12
这称为"显式接口实现".其原因可能是例如命名冲突.
考虑接口IEnumerable和IEnumerable<T>.一个声明了非泛型方法
IEnumerator GetEnumerator();
Run Code Online (Sandbox Code Playgroud)
另一个是通用的:
IEnumerator<T> GetEnumerator();
Run Code Online (Sandbox Code Playgroud)
在C#中,不允许有两个具有相同名称的方法,只有返回类型不同.因此,如果您实现两个接口,则需要声明一个方法显式:
public class MyEnumerable<T> : IEnumerable, IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
... // return an enumerator
}
// Note: no access modifiers allowed for explicit declaration
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator(); // call the generic method
}
}
Run Code Online (Sandbox Code Playgroud)
无法在实例变量上调用显式实现的接口方法:
MyEnumerable<int> test = new MyEnumerable<int>();
var enumerator = test.GetEnumerator(); // will always call the generic method.
Run Code Online (Sandbox Code Playgroud)
如果要调用非泛型方法,则需要强制转换test为IEnumerable:
((IEnumerable)test).GetEnumerator(); // calls the non-generic method
Run Code Online (Sandbox Code Playgroud)
这似乎也是为什么在显式实现上不允许访问修饰符(如public或private)的原因:它在类型上是不可见的.