代码之家  ›  专栏  ›  技术社区  ›  RichardOD

什么是私有接口?

c#
  •  44
  • RichardOD  · 技术社区  · 17 年前

    不久前在一次.NET职位的面试中,面试官问我:“你会用一个私人界面做什么?”.

    我问他,他说的是隐式和显式接口实现之间的区别吗?他回答说不是。

    所以我想知道:

    1. 他的意思是什么?
    2. 使用私有接口的目的是什么?
    5 回复  |  直到 10 年前
        1
  •  32
  •   ShuggyCoUk    17 年前

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

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

    就实用性而言,它只是对其他代码隐藏,即使在同一个程序集中,也存在这样的接口。在我看来,这种方法的效用并不高。

    Explicit interface implementation 是另一回事,有一些非常有用的案例(尤其是在处理泛型和较旧的非泛型接口时),但我不会将其称为“私有接口”,也不会说该术语通常以这种方式使用。

    结合使用这两种技术,您可以做到:

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

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

        2
  •  10
  •   afuzzyllama user7757658    10 年前

    this link .

    私有接口继承

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

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

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

    在这种情况下, PrivateImplementer 是众所周知的执行 IFoo . 因此,一个实例可以被多态地视为 IFOO . 但如果你不把它当作 IFOO . 此代码演示了这一点:

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

    您可以选择接口的各个方法进行私有实现。例如,如果 私人实施者 实施 IFooBar 它可能选择私下实现foo,但禁止公开使用普通语法。

    在实践中,很少有使用私有实现的常见情况。这个 System.Collections.Generic 库使用此方法秘密实现所有遗留系统集合的弱类型接口。这使得向后兼容性“正常工作”,例如传递 List<T> 到需要 IList 会很好的。在这个特定的示例中,混乱新类型的API是很遗憾的(对于弱类型的互操作性,有相当多的方法是必要的)。

    “不,”如果他想知道你所知道的,那是个很糟糕的回答。听起来像是一个只想展示他们知道多少的人。

        3
  •  2
  •   Community Mohan Dere    9 年前

    Shuggycouk给出了很好的回答,但有这样的评论

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

    我必须说,这绝对不是只有聪明的面试官才具备的能力。

    这里是 Realization of Full State Machine (FSM) with inheritance and unitest support 这是使用私有/受保护接口的好例子。

    这是一个关于问题的答案 What is the C# equivalent of friend? Why does C# not provide the C++ style 'friend' keyword? 事实上,你的问题也是。

        4
  •  1
  •   Gerrie Schenck    17 年前

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

        5
  •  1
  •   majkinetor    17 年前

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

    我不认为这可以应用于c_tho,因为通过显式接口和将主机强制转换到适当接口的客户机可以实现相同的IMO效果。

    也许有人能看到我错过的东西……

    我也在 MSDN :

    接口方法具有公共的 可访问性,不能更改 按实现类型。内部的 接口创建的合同是 不打算在外部实施 定义 接口。一种公共类型 实现内部方法 使用虚拟修饰符的接口 允许方法被重写 在 装配。如果在 定义程序集调用方法和 期望有一个内部专用合同, 当 相反,中的重写方法 执行外部程序集。这个 创建安全漏洞。