什么是私人界面?

前一段时间在面试.NET时,采访者问我“你将使用什么私人界面?”。

我问他是否意味着他回答否定的隐式与显式接口实现之间的区别。

所以我想知道:

  • 他的意思是?
  • 你会用什么私人界面?

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

    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;
        }
    }
    

    就实用程序而言,它只是隐藏在其他代码中,即使在相同的程序集中,也只是说存在接口。 这在我看来并不是非常高。

    明确的接口实现是另一回事,有一些非常有用的例子(特别是使用泛型和较老的非泛型接口时),但我不会将其称为“专用接口”,并且不会说该术语通常以这种方式使用。

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

    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
        }
    }
    

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


    从这个链接。

    私有接口继承

    历史上,语言允许私有继承。 在C ++中,您可以继承一个类型,而不会与该类型进行多态兼容。 这只是重用实现的一种便捷方式。 在CTS中,您不能执行私有实现继承。 但是你可以使用私有接口继承。

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

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

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

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

    “不”,如果他想知道你知道的是什么,这是一个很不好的答案。 听起来像某人只是想显示他们知道多少。


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

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

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

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

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

    链接地址: http://www.djcxy.com/p/82181.html

    上一篇: What is a private interface?

    下一篇: case of friend classes in C#