2010-02-17 24 views
13

Me gustaría implementar solo ciertas interfaces dentro de otras interfaces, no quiero que una clase las pueda heredar directamente.C# Interfaces: solo implementa una interfaz en otras interfaces

¡Gracias de antemano!

+4

He vuelto a leer la pregunta y sigo pensando que necesita un ejemplo – mythz

+1

Leyendo nuevamente la pregunta, creo que está pidiendo algún constructo para evitar la implementación ** directa ** de una interfaz en una clase mientras no evitando que otras interfaces hereden de él. –

+0

Ejemplo: Tengo una interfaz llamada IAnimation, deseo implementar solo esta interfaz a través de una interfaz INonAnimated o IAnimated. De esta forma, ambas interfaces hijo tienen las mismas reglas básicas. – Kukks

Respuesta

25

No puede hacer esto en C# - cualquier clase puede implementar cualquier interfaz a la que tenga acceso.

¿Por qué querrías hacer esto? Tenga en cuenta que al declarar una herencia de interfaz:

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

Usted está especificando que cualquier cosa implementar InterfaceB también tiene que implementar InterfaceA, de manera que obtendrá las clases que implementan InterfaceA de todos modos.

+0

Ah, pensó que este era el caso, ¡gracias por aclararlo! – Kukks

+0

InterfaceA pública interfaz {} InterfaceB interfaz pública: InterfaceA {} interfaz pública InterfaceC: InterfaceA {} InterfaceA sostendría el común [i] normas [/ i] que iba a usar en InterfaceB y InterfaceC – Kukks

-1

Lo mejor que puedo sugerir es ponerlos - tanto el nivel superior como las interfaces descendientes, en un ensamblaje separado, con las interfaces de nivel base declaradas como internal, y las interfaces que extienden esas interfaces como public.

+0

es entonces posible implementar realmente las interfaces de nivel superior, si las súper interfaces no son accesibles para la clase implementadora? – thecoop

+0

Obtengo esto: 'Accesibilidad inconsistente: la interfaz base 'IBaseInterface' es menos accesible que la interfaz 'IDescendantOfBaseInterface''. C# 4.0. –

1

En primer lugar, no tiene sentido decir "implementar dentro de otras interfaces" porque las interfaces no pueden implementar nada.

Puedo ver dos formas defectuosas de hacer esto, más o menos.

  1. Realice clases abstractas animadas y no animadas que implementen IAnimation. La clase concreta por debajo de ellos todavía puede anular la fuerza a sus métodos IAnimation con el nuevo operador:

    class SomeAnim : Animated 
    { 
        public new void Foo() { } 
    } 
    
  2. Use mixins. Mantenga IAnimated e INonAnimated como interfaces, pero no ponga ningún método en su interfaz. En lugar de definir los métodos de extensión como esta:

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

de nuevo, un poco de un truco. Pero lo que estás tratando de hacer indica los defectos de diseño de todos modos.

+0

formatear el código, ver aquí: http://meta.stackexchange.com/questions/19624/bug-in-markdown-formatter/19799#19799 Necesita sangrar su código en 8 espacios en lugar de 4 – thecoop

+0

gracias, yo pregunto cuando eso cambió ... – Tesserex