No hay nada de malo en tener una interfaz que herede otra interfaz sin agregar nuevos miembros, si se espera que todas las implementaciones de la última interfaz puedan hacer cosas útiles que algunas implementaciones de la primera no pueden hacer. De hecho, es un buen patrón que, en mi humilde opinión, debería haberse usado más en cosas como .NET Framework, especialmente porque un implementador cuya clase satisfaría naturalmente las restricciones implícitas en la interfaz más derivada puede indicar que simplemente implementando la interfaz más derivada , sin tener que cambiar ninguno de los códigos o declaraciones de implementación de miembros.
Por ejemplo, supongamos que tengo las interfaces:
interfaz IMaybeMutableFoo {
Bar Thing {get; set;} // Y también otras propiedades
bool IsMutable;
IImmutableFoo AsImmutable ();
}
interfaz IImmutableFoo: IMaybeMutableFoo {};
Se IImmutableFoo.AsImmutable()esperaría que se implementara una implementación de ; IMaybeMutableFoo.AsImmutable()se espera que una implementación de clase mutable devuelva un nuevo objeto profundamente inmutable que contiene una instantánea de los datos. Una rutina que quiere almacenar una instantánea de los datos contenidos en un IMaybeMutableFoopodría ofrecer sobrecargas:
público vacío StoreData (IImmutableFoo ThingToStore)
{
// Almacenar la referencia será suficiente, ya que se sabe que ThingToStore es inmutable
}
público vacío StoreData (IMaybeMutableFoo ThingToStore)
{
StoreData (ThingToStore.AsImmutable ()); // Llamar a la sobrecarga más específica
}
En los casos en que el compilador no sabe que lo que se va a almacenar es un IImmutableFoo, llamará AsImmutable(). La función debería volver rápidamente si el elemento ya es inmutable, pero una llamada a la función a través de una interfaz todavía lleva tiempo. Si el compilador sabe que el elemento ya es un IImmutableFoo, puede omitir la llamada de función innecesaria.
IAnimalyIDogson terribles nombres de tautología!