在下面的代码中,我正在实现一个接口,然后从该类派生并实现相同的接口。当我处理派生类的实例时,它只调用派生的实现。
为什么C#编译器不会对此发出警告?由于几个原因,这似乎很危险。我可以实现一个基础实现的接口,这将给我一些我没想到的行为(比如基地不再处理)。或者,如果我后来决定让基础实现一个新接口,我必须扫描所有代码以找到可能已经实现它的任何衍生物。
对于派生类中的重复成员,编译器要求我们使用'override'或'new'。
为什么界面不同?
class CA : IDisposable
{
void IDisposable.Dispose() { Debug.WriteLine("CA.Dispose"); }
}
class CB : CA, IDisposable
{
void IDisposable.Dispose() { Debug.WriteLine("CB.Dispose"); }
}
class Program
{
static void Main(string[] args)
{
using (new CB()) { }
}
}
// output: CB.Dispose
答案 0 :(得分:6)
它只是这样做,因为你正在使用显式接口实现。例如,这不编译:
using System;
using System.Diagnostics;
class CA : IDisposable
{
public void Dispose()
{
Debug.WriteLine("CA.Dispose");
}
}
class CB : CA, IDisposable
{
public void Dispose()
{
Debug.WriteLine("CB.Dispose");
}
}
所以是的,您需要小心显式接口实现。情况总是如此,因为无论如何,它在类型系统方面有点奇怪。
这并不理想,但明确的界面实现部分是为了解决您希望能够重新实现界面的尴尬局面。
老实说,如果你在最后阶段决定一个基类应该开始实施IDisposable
,那么无论如何你都处于一个受伤的世界 - 因为你必须检查每个地方你是使用该类来判断您是否需要using
语句。