Shu*_*oUk 34
接口可以在另一个类中是私有的
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在实用程序方面,它简单地隐藏在其他代码中,即使在同一个程序集中,也存在所述接口存在.在我看来,这个用途并不是非常高.
显式接口实现是一个不同的问题,有一些非常有用的情况(特别是在使用泛型和较旧的非泛型接口时)但我不会将其称为"私有接口",并且不会说该术语通常以这种方式使用.
将这两种技术结合使用,您可以:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这允许您以某种方式公开嵌套类,同时允许父类调用外部世界不能的方法.这是一个潜在有用的案例,但我不希望经常使用.当然,在面试中使用它是因为他们已经看到它并且虽然它是"有趣的"
Mar*_*son 10
从这个链接.
专用接口继承
从历史上看,语言允许私有继承.在C++中,您可以从类型继承而不与该类型进行多态兼容.这只是重用实现的便捷方式.在CTS中,您无法进行私有实现继承.但您可以使用私有接口继承.
私有接口继承实际上只是一种从类型的公共API隐藏方法的方法.它们被编译为私有方法,但实际上可以通过类型的接口映射访问.换句话说,它们只能通过类型化的引用来调用,作为定义方法的接口.一个例子将使这更容易理解:
Run Code Online (Sandbox Code Playgroud)class PrivateImplementer : IFoo { void IFoo.Foo() { Console.WriteLine("PrivateImplementer::IFoo.Foo"); } }在这种情况下,
PrivateImplementer公知已实施IFoo.因此,可以将实例多态地视为实例IFoo.但除非你把它视为一个,否则你实际上不能称它为FooIFoo.此代码演示了这一点:Run Code Online (Sandbox Code Playgroud)PrivateImplementer p = new PrivateImplementer(); p.Foo(); // This line will fail to compile IFoo f = p; f.Foo();您可以选择接口的各个方法来私下实现.例如,如果
PrivateImplementer实现IFooBar,它可能选择私下实现Foo,但Bar公开使用普通语法.实际上,您使用私有实现的常见情况并不多.该
System.Collections.Generic库使用此方法秘密实现所有遗留的System.Collections弱类型接口.这使得向后兼容性"正常工作",例如将一个实例传递List<T>给期望一个IList将正常工作的方法.在这个具体的例子中,混乱新类型的API会很遗憾(弱类型互操作性需要很多方法).
"不,"如果他想找出你所知道的,那就是一个非常糟糕的答案.听起来像是只想表明他们知道多少的人.