内部接口实现

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

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

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

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

一些更有用的信息:Interface1Interface2在另一个核心组件中定义为公共,并且不能更改。

提问于
用户回答回答于

虽然你可以使接口本身内部,但方法仍然是公共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

除此之外,如果你需要世界永远不知道类支持接口,那么你只需要不需要类实现接口。接口是为了广播的目的,一个给定的对象明确地或以其他方式支持给定的行为。如果那不是你想要的,你需要去一个不同的方向。它可以简单地说就是该类将行为实现为私有实现细节,sans接口。另一种方法是将这些实现铲入私有嵌套类。

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。但是,好处是如果类需要调用需要接口的外部定义的方法,它仍然可以将嵌套类实例传递给这些方法。

用户回答回答于

无法将铸造操作限制为接口。但是,您可以提供一个实现接口但不能正常使用的包装类。

例如:

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

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

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问5 回答
  • 无聊至极

    4 粉丝504 提问5 回答
  • 嗨喽你好

    7 粉丝480 提问4 回答
  • 富有想象力的人

    4 粉丝0 提问4 回答

扫码关注云+社区

领取腾讯云代金券