什么是私人界面?

面试官刚才在一次面试中问了一个问题:“你会用什么私人界面?”。

我问他是不是他的回答不是他的意思是显式接口实现与显式接口实现之间的区别。

所以我想知道:

  1. 他的意思是?
  2. 你会用什么私人界面?

一个接口可以在另一个类中是私有的

public class MyClass { private interface IFoo { int MyProp { get; } } private class Foo : IFoo { public int MyProp { get; set; } } public static void Main(string[] args) { IFoo foo = new Foo(); return foo.MyProp; } } 

就实用程序而言,它只是简单地隐藏在其他代码中,即使在同一个程序集中也是如此。 这在我看来并不是非常高。

显式接口的实现是一个不同的问题,有一些非常有用的情况下(特别是使用generics和旧的非generics接口时),但我不会称之为“专用接口”,并不会说这个术语通常以这种方式使用。

一起使用这两种技术你可以做到:

 public class MyClass { private interface IFoo { int MyProp { get; } } public class Foo : IFoo { int IFoo.MyProp { get; set; } } public static void Main(string[] args) { IFoo foo = new Foo(); return foo.MyProp; } } public class HiddenFromMe { public static void Main(string[] args) { MyClass.Foo foo = new MyClass.Foo(); return foo.MyProp; // fails to compile } } 

这允许您以某种方式暴露嵌套的类,同时允许父类调用外部世界不能的方法。 这是一个潜在的有用的案例,但不是我希望经常使用的东西。 当然,在面试中这是一个面试官使用的边界案例,因为他们已经看到了这一点,虽然这是“有趣的”

从这个链接 。

私有接口inheritance

历史上,语言允许私有inheritance。 在C ++中,您可以inheritance一个types,而不会与该types进行多态兼容。 这只是一个重用实现的简便方法。 在CTS中,你不能做私有的实现inheritance。 但是你可以使用私有接口inheritance。

私有接口inheritance实际上只是一种从types的公共API中隐藏方法的方法。 它们被编译成私有方法,但实际上可以通过types的接口映射来访问。 换句话说,它们只能通过types化的引用来调用,作为定义方法的接口。 一个例子会使这个更容易理解:

 class PrivateImplementer : IFoo { void IFoo.Foo() { Console.WriteLine("PrivateImplementer::IFoo.Foo"); } } 

在这种情况下, PrivateImplementer是众所周知的实施IFoo 。 因此,可以将一个实例作为IFoo一个实例进行多态处理。 但是除非你把它当作IFoo ,否则你实际上不能把Foo叫做它。 这段代码演示了这个:

 PrivateImplementer p = new PrivateImplementer(); p.Foo(); // This line will fail to compile IFoo f = p; f.Foo(); 

您可以select一个接口的个别方法来私下实现。 例如,如果PrivateImplementer实现了IFooBar ,它可能会select私自实现Foo,但是Bar会公开使用普通的语法。

在实践中,你会使用私有实现的情况并不多。 System.Collections.Generic库使用这种方法来秘密实现所有旧的System.Collections弱types的接口。 这使得向后兼容性“只是工作”,例如将一个List<T>的实例传递给一个方法,期望IList将工作得很好。 在这个特定的例子中,混淆新types的API将是一个遗憾(弱types互操作性需要相当多的方法)。

“不”,如果他正在寻找你所知道的东西,那么这个答案是相当可怜的。 听起来像一个人只是想显示他们知道多less。

ShuggyCoUk给出了很好的答案,但有这样的评论

这是一个潜在的有用的案例,但不是我希望经常使用的东西。 当然,在面试中这是一个面试官使用的边界案例,因为他们已经看到了这一点,虽然这是“有趣的”

我必须说,绝对不是只有聪明的采访者的能力。

这里是实现全状态机(FSM)的inheritance和支持 ,这是私有/受保护接口使用的一个很好的例子。

这是对问题的回答什么是C#相当于朋友? 为什么C#不提供C ++风格的“朋友”关键字? 实际上也是关于你的问题。

就像内部类(也是私有的)一样,您可以在现有类中使用私有接口。

我search了一下,发现这篇文章解释了如何使用私有接口为不同的客户端提供不同的接口。 这是C ++的故事。

我不认为这可以应用到C#tho,因为可以通过显式接口和客户端将主机投递到适当的接口来实现相同的效果IMO。

也许别人可以看到我错过的东西….

我也在MSDN上find了这个:

接口方法具有公共可访问性,不能被实现types改变。 内部接口创build的合同不打算在定义接口的程序集之外实现。 使用虚拟修饰符实现内部接口方法的公共types允许该方法由程序集外部的派生types重写。 如果定义程序集中的第二个types调用该方法,并期望一个仅限内部的约定,则执行外部程序集中的重写方法时,行为可能会受到影响。 这会造成安全漏洞。