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

如何实现内部接口的成员

  •  21
  • jpoh  · 技术社区  · 17 年前

    我一直在重构我目前参与的项目的代码库,以便将在程序集范围之外没有用处的类/接口声明为内部(而不是公共)。但我遇到了以下代码的问题:

    internal interface IFirstInterface
    {
        ...
    }
    
    internal interface ISecondInterface
    {
        IFirstInterface First{ get; }
        ...
    }
    
    public class Implementer : ISecondInterface
    {
        public IFirstInterface First {get; private set;}
        ...
    }
    

    1. 为什么内部接口的成员必须公开实现?如果在内部类上实现接口,那么实现的成员不应该是内部的吗?这不是一个大问题,因为接口成员无论如何都不会公开访问,因为类是内部的。这似乎是违反直觉的。

    2. 主要问题在于上面的场景,因为我不能为IFirstInterface提供公共getter,因为它据称是一个内部接口,即我从编译器中得到以下错误:

    不一致的可访问性:属性 类型“IFirstInterface”较少 比财产更容易接近 “实施者优先”

    注 :我意识到这项重构工作可能没有什么价值,但我认为这是一个让我更深入地理解内部修饰符含义的好方法。

    3 回复  |  直到 13 年前
        1
  •  50
  •   Jon Skeet    17 年前

    请注意-您实际提供的代码 做 Implementer 是一个内部类。问题是什么时候出现的 实施者

    解决方法是使用显式接口实现:

    public class Implementer : ISecondInferface
    {
        private IFirstInterface first;
        IFirstInterface ISecondInterface.First { get { return first; } }
    }
    

    能够 作为一种替代方法:

    public class Implementer : ISecondInterface
    {
        internal IFirstInterface First { get; private set; }
        IFirstInterface ISecondInterface.First { get { return First; } }
    }
    

        2
  •  11
  •   Fredrik Mörk    17 年前

    为什么内部接口的成员必须公开实现?

    定义接口时,不会为成员定义访问级别,因为所有接口成员都是 public . 即使接口本身是 internal ,成员仍在考虑中 公众的 . 当您对这样一个成员进行隐式实现时,签名必须匹配,因此需要 公众的

    关于暴露getter,我建议 明确的 而是实现接口,并创建 内部的 属性以公开该值:

    internal IFirstInterface First { get; private set; }
    
    IFirstInterface ISecondInterface.First
    {
        get { return this.First; }
    }
    
        3
  •  7
  •   Robert    15 年前

    我知道这篇文章已经有几年历史了,但我认为值得注意的是,您可以在公共类上实现内部接口,请参见以下链接:

    http://forums.create.msdn.com/forums/p/29808/167820.aspx
    http://msdn.microsoft.com/en-us/library/aa664591%28VS.71%29.aspx

    
    internal interface ISecretInterface
    {
        string Property1 { get; }
    }
    
    public class PublicClass : ISecretInterface
    {
        // class property
        public string Property1
        {
            get { return "Foo"; }
        }
    
        // interface property
        string ISecretInterface.Property1
        {
            get { return "Secret"; }
        }
    }