内部接口实现

时间:2011-11-22 16:30:39

标签: c# .net interface

直接问题:我有一个实现两个接口的类:

public class A : Interface1, Interface2{
   // Interface 1 implementation...
   // Interface 2 implementation...
}

有没有办法(不创建另一个新类)使Interface1实现内部并将其隐藏在其他组件中(只有Interface2会保持公开)?

编辑:一些更有用的信息:Interface1Interface2在另一个核心组件中定义为公开,无法更改。

提前致谢,

2 个答案:

答案 0 :(得分:35)

虽然您可以将接口本身设置为内部,但这些方法仍然是公共API的一部分。您可以选择做的是显式接口实现,以便接口定义的API只能通过接口显示,而不是通过类。

interface IFoo
{
     void M();
}

interface IBar
{
     void X(); 
}

public class Bar : IBar, IFoo
{
    public void X() // part of the public API of Bar
    {
    }

    void IFoo.M() // explicit implementation, only visible via IFoo
    {
    }
}

Bar bar = new Bar();
bar.X(); // visible
bar.M(); // NOT visible, cannot be invoked
IFoo foo = bar;
foo.M(); // visible, can be invoked

除此之外,如果您需要世界从不知道该类支持该接口,那么您只需要让该类实现该接口。接口用于广播的目的是给定对象明确地或以其他方式支持给定的行为。如果那不是你想要的,你需要走另一个方向。它可能只是该类将行为实现为私有实现细节,没有接口。另一种方法是将这些实现转换为私有嵌套类。

public class Bar : IBar
{
    Foo foo = new Foo();

    public void X() { }   

    public void DoSomething()
    {
        this.foo.M(); // invokes method of instance of nested class
    }

    class Foo : IFoo
    {
        public void M() { } 
    }
}

根据这种方法,世界永远不会知道某个类符合接口合同,因为它在技术上没有。合同由Foo完成,而世界不能见Foo。但是,好处是如果类需要调用需要接口的外部定义方法,它仍然可以将嵌套类实例传递给这些方法。

答案 1 :(得分:3)

无法将转换操作限制为接口。但是,您可以提供实现接口的包装类,但通常不可用。

例如:

public class Foo
{
    private IFoo wrap = new WrapFoo(this);

    internal IFoo GetIFoo()
    {
        return wrap;
    }

    private class WrapFoo : IFoo
    {
        public WrapFoo(Foo parent)
        {
            //Save parent
        }

        public void DoSomething()
        {
            //Implement interface
        }
    }
}

另一种更复杂的方法是使用代码签名来验证调用者是否为库,否则抛出异常。