2010-02-17 98 views
13

我只想在其他接口中实现某些接口,我不希望它们能够被类直接继承。C#接口 - 仅实现其他接口中的接口

在此先感谢!

+4

我已经重读了这个问题,我仍然认为你需要一个例子 – mythz 2010-02-17 18:42:44

+1

再次读这个问题,我想你要求一些构造来防止**直接**实现一个类的接口,而不是阻止其他接口继承它。 – 2010-02-17 18:44:54

+0

示例:我有一个名为IAnimation的接口,我只想通过接口INonAnimated或IAnimated实现此接口。这样,两个子接口都拥有相同的基本规则。 – Kukks 2010-02-17 18:47:28

回答

25

你不能在C#中做到这一点 - 任何类都可以实现它有权访问的任何接口。

你为什么要这么做?请记住,通过声明的接口继承:

public interface InterfaceA {} 
public interface InterfaceB : InterfaceA {} 

你指定的任何实施InterfaceB也必须实现InterfaceA,所以你会得到实现InterfaceA反正类。

+0

啊,认为是这种情况,谢谢你清理它! – Kukks 2010-02-17 18:44:47

+0

公共接口了InterfaceA {} 公共接口InterfaceB:了InterfaceA {} 公共接口但InterfaceC:了InterfaceA {} 了InterfaceA将持有通用[I]规则[/ I],我会在InterfaceB和InterfaceC仍 – Kukks 2010-02-17 18:53:17

-1

我可以建议的最好的方法是将它们 - 顶层和下降的接口放在单独的程序集中,声明为基本级接口internal,以及将这些接口扩展为public的接口。

+0

使用它是那么如果超级接口不能被实现类访问,可能实际实现顶级接口? – thecoop 2010-02-17 18:52:59

+0

我得到这个:'不一致的可访问性:基本接口'IBaseInterface'比接口'IDescendantOfBaseInterface''更难以访问。 C#4.0。 – 2013-02-07 17:21:01

1

首先,说“在其他接口中实现”是没有意义的,因为接口不能实现任何东西。

我可以看到两个有缺陷的方法,这样做。

  1. 制作实现动画的动画和非动画抽象类。它们下面的具体类仍然可以强制使用new运算符重载你IAnimation方法:

    class SomeAnim : Animated 
    { 
        public new void Foo() { } 
    } 
    
  2. 使用混入。保持IAnimated和INonAnimated作为接口,但不要在接口中放置任何方法。取而代之的定义扩展方法是这样的:

    static class Ext 
    { 
        public static void Foo(this IAnim anim) 
        { 
         if (anim is IAnimated) // do something 
         else if (anim is INonAnimated) // do something else 
        } 
    } 
    

再次,一个黑客攻击的一位。但是你试图做的事情反映了设计缺陷。

+0

重新编码格式,请参阅此处:http://meta.stackexchange.com/questions/19624/bug-in-markdown-formatter/19799#19799 您需要将您的代码缩进8位而不是4 – thecoop 2010-02-17 19:08:22

+0

谢谢,我想知道什么时候改变了... – Tesserex 2010-02-17 19:20:49