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!
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!
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.
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
.
es entonces posible implementar realmente las interfaces de nivel superior, si las súper interfaces no son accesibles para la clase implementadora? – thecoop
Obtengo esto: 'Accesibilidad inconsistente: la interfaz base 'IBaseInterface' es menos accesible que la interfaz 'IDescendantOfBaseInterface''. C# 4.0. –
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.
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() { }
}
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.
He vuelto a leer la pregunta y sigo pensando que necesita un ejemplo – mythz
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. –
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