首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >内部接口实现

内部接口实现
EN

Stack Overflow用户
提问于 2011-11-23 00:30:39
回答 2查看 9.3K关注 0票数 17

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

代码语言:javascript
复制
public class A : Interface1, Interface2{
   // Interface 1 implementation...
   // Interface 2 implementation...
}

有没有一种方法(不需要创建另一个新类)使Interface1实现成为内部的,并对其他组件隐藏它(只有Interface2将保持公共)?

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

提前谢谢你,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-23 00:32:18

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

代码语言:javascript
复制
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接口。另一种方法是将这些实现放入私有嵌套类中。

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

票数 35
EN

Stack Overflow用户

发布于 2011-11-23 02:16:00

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

例如:

代码语言:javascript
复制
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
        }
    }
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8230179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档