在我的情况下,显式实现不起作用

时间:2019-03-13 07:08:22

标签: c# interface

我不太了解显式实现的工作原理,所以我制作了一个模型

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类正常工作?

1 个答案:

答案 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();