C# - “明确实现的接口成员总是隐式私有的原因是什么?”

时间:2009-09-08 06:06:56

标签: c#

当我需要显式实现接口成员时,它是私有的。

例如:

 // when explicit implementation it is always private
  void IPointy.Draw( )

  {

  }

为什么强制实施这样的设计规则?

注意:

当两个接口具有相同的方法时,为了避免冲突我必须明确实现为

class Line :IPointy
{

       // Now it is private    
       void IPointy.Draw( )

      {


      }

}

我的问题是实施的原因是私有的。

3 个答案:

答案 0 :(得分:19)

明确实现的接口成员不仅仅是私有的。他们是公开的 - 有点像。

它们是公开的,任何可以强制引用接口的代码都可以调用它们。 (如果界面本身不公开,那么我猜你可以说它们实际上具有与界面相同的访问级别。)

他们没有任何指定的访问级别,因为他们 在接口方面是公开的:没有任何选择。它们不是一般类型的公共成员的公共成员,但它们可以从任何其他程序集中调用,这些程序集可以获取引用并将其强制转换为接口类型...

C#3.0规范就是这样说的:

  

显式接口成员   实现有不同   可访问性特征比   其他成员。因为明确   接口成员实现是   从来没有完全可以访问   方法调用中的限定名称   或财产访问,他们在一个   感觉私密。但是,因为他们可以   通过界面访问   例如,它们在某种意义上也是如此   公共

答案 1 :(得分:0)

因为该类实现的2个接口可以具有相同名称的方法。这就是为什么该方法在通过类引用访问时是私有的,而在接口时是公共的。

答案 2 :(得分:0)

因为你说我的对象是IPointy而不是你可以调用IPointy方法绘制。否则没有。

 public interface IPointy
{
    void Draw();
}

public class PointyImplementer : IPointy
{
    #region IPointy Members

    void IPointy.Draw()
    {
        Console.WriteLine("You have drawn");
    }

    #endregion
}

class Program
{
    static void Main(string[] args)
    {
        IPointy pi = new PointyImplementer();

        pi.Draw();

        Console.Read();
    }
}

这是一种掩盖正在实现的界面的方法。