我不太了解显式实现的工作原理,所以我制作了一个模型
public class ShoppingCart : IEnumerable<Product>
{
public IEnumerator<Product> GetEnumerator()
{
return Products.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() //why 'public' is not needed?
{
return GetEnumerator(); // why there is not any error here?
}
}
下面是我的模型:
class MockUp: Ilayer1
{
public string testMethod()
{
return "Layer1";
}
string Ilayer2.testMethod() // error, not all code path return a value
{
testMethod();
}
}
interface Ilayer1 : Ilayer2
{
string testMethod();
}
interface Ilayer2
{
string testMethod();
}
但是我有一个编译错误,但是ShoppingCart为什么没有错误?
如何使我的MockUp类正常工作?
答案 0 :(得分:1)
让我一个接一个地回答问题:
为什么不需要“公开”?
自从我们放置public
以来,我们就会出现歧义:
public IEnumerator<Product> GetEnumerator() {...}
public IEnumerator IEnumerable.GetEnumerator() {...}
如果是ShoppingCart.GetEnumerator();
,将执行哪种方法?这就是为什么显式接口实现有效地private
// public
public IEnumerator<Product> GetEnumerator() {...}
// private
IEnumerator IEnumerable.GetEnumerator() {...}
到目前为止,在ShoppingCart.GetEnumerator();
的情况下,我们称之为唯一的public
方法(没有歧义)。在(ShoppingCart as IEnumerable).GetEnumerator();
的情况下,我们称其为接口实现(同样,我们只有一种适合的方法)。
我有一个编译错误,但是为什么没有错误 购物车?
string Ilayer2.testMethod() // error, not all code path return a value
{
testMethod();
}
该方法应返回string
,但不会这样做。添加return
:
string Ilayer2.testMethod() // error, not all code path return a value
{
return testMethod();
}
甚至
string Ilayer2.testMethod() => testMethod();