2009-08-03 69 views
19

我一直在重构我目前正在进行的项目的代码库,以便超出程序集限制的无用的类/接口应该被声明为内部(而不是公共的) 。但是我碰到下面的代码有问题:我如何实现内部接口的成员

internal interface IFirstInterface 
{ 
    ... 
} 

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

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

我的问题:

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

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

可访问性不一致:财产 型 'IFirstInterface' 比属性访问少 'Implementer.First'

是疗法以任何方式解决这个问题?

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

+0

如果它的一个选项,您可以通过使用一个抽象基类,而不是绕过的接口方法是公开的限制。 – 2017-01-25 14:30:53

回答

45

只需要注意 - 您实际提供的代码确实是编译,因为Implementer是一个内部类。问题出现在Implementer是公开的。

的办法解决这是使用显式接口实现:

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

你不能在那里二传手,因为你明确地执行那些没有定义setter方法的接口。您可以将此作为一种替代方案:

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

这是不幸的内部接口有public成员 - 它不复杂的事情就是这样。公共接口有一个内部成员(实现者或声明者是内部的东西)会很奇怪,但对于内部接口来说,它更有意义。

+0

啊,对。我会编辑我的问题,以免让读者感到困惑。谢谢! – jpoh 2009-08-03 14:36:36

10

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

定义接口时,由于所有接口成员都是public,所以不定义成员的访问级别。即使这样的界面是internal,成员仍然被认为是public。当你隐式实现这样一个成员时,签名必须匹配,所以它需要是public

关于露出消气,我建议做一个明确接口的实现,而是和创建internal财产暴露值:

internal IFirstInterface First { get; private set; } 

IFirstInterface ISecondInterface.First 
{ 
    get { return this.First; } 
} 
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"; } 
    } 
} 
+0

2011年的答案与2009年的两个答案有何不同? – 2015-10-13 09:04:06

相关问题