如何实现内部接口的成员

jpo*_*poh 22 c# interface internal

我一直在重构我目前正在进行的项目的代码库,因此除了程序集的范围之外没有用的类/接口应该被声明为内部(而不是公共).但是我遇到了以下代码的问题:

internal interface IFirstInterface
{
    ...
}

internal interface ISecondInterface
{
    IFirstInterface First{ get; }
    ...
}

public class Implementer : ISecondInterface
{
    public IFirstInterface First {get; private set;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

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

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

可访问性不一致:属性类型"IFirstInterface"比属性"Implementer.First"更难访问

有没有办法解决?

注意:我意识到这个重构练习可能没什么价值,但我认为这将是一个很好的方式让我更深入地了解内部修饰符的含义.

Jon*_*eet 48

需要注意的是 - 你实际提供的代码编译的,因为它Implementer是一个内部类.当Implementer公开时,问题就来了.

解决这个问题的方法是使用显式接口实现:

public class Implementer : ISecondInferface
{
    private IFirstInterface first;
    IFirstInterface ISecondInterface.First { get { return first; } }
}
Run Code Online (Sandbox Code Playgroud)

你不能在那里有setter,因为你明确地实现了没有定义setter的接口.你可以这样做:

public class Implementer : ISecondInterface
{
    internal IFirstInterface First { get; private set; }
    IFirstInterface ISecondInterface.First { get { return First; } }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,内部接口有公共成员 - 它确实使这样的事情变得复杂.公共接口有一个内部成员(实现者或声明者的内部成员是什么?)会很奇怪,但对于内部接口来说,它更有意义.


Fre*_*örk 11

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

定义接口时,不要为成员定义访问级别,因为所有接口成员都是public.即使这样的界面internal,仍然考虑成员public.当你对这样一个成员进行隐式实现时,签名必须匹配,所以它必须是public.

关于暴露getter,我建议改为明确实现接口,并创建一个internal属性来公开值:

internal IFirstInterface First { get; private set; }

IFirstInterface ISecondInterface.First
{
    get { return this.First; }
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ert 7

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

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"; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 老实说,我不知道,我可以看到为什么我会添加它,虽然我记得这样做.它没有添加任何东西,我一直试图通过查看修订历史来弄清楚是否有线索但仍然没有.也许我有一个愚蠢的日子. (2认同)