2009-04-30 23 views
43

Si tengo clase B: A {}¿Cómo se llama cuando una interfaz "hereda" de otra?

me dicen que "la clase B hereda clase A" o "Clase B se deriva de la clase A".

Sin embargo, si en lugar de tener:

class B : ISomeInterface {} 

es incorrecto decir "B hereda ISomeInterface" - el término correcto es decir "B implementa ISomeInterface".

Pero, decir que tengo

interface ISomeInterface : ISomeOtherInterface {} 

Ahora, sigue siendo erróneo decir "hereda", pero es ahora tan mal decir "implementos", ya ISomeInterface no implementa nada.

Entonces, ¿cómo llamas a esa relación?

+2

una serie de opciones: http://thesaurus.reference.com/search?q=extend personalmente me gusta "engrandece ISomeInterface ISomeOtherInterface ":-) – nickf

+0

Entonces, ahora es válido hacer lo que está preguntando: interface ISomeInterface: ISomeOtherInterface? ¿Fue esto "implementado", si disculpa el juego de palabras, en la última especificación del lenguaje C# (si es así, ¿a partir de qué versión?) Me pregunto si todavía estoy atrapado en un túnel ... – joedotnot

Respuesta

57

Yo personalmente digo "extiende" y yo pensamiento la especificación C# usa esa palabra también en algún lugar (no puedo encontrarla ahora, desafortunadamente) - pero recuerdo a Eric Lippert diciendo que no estaba interesado en eso, y quería cambiarlo por 4.0.

Creo que es bueno, porque muestra que está extendiendo el contrato especificado por la interfaz original.

EDIT: Después de examinar la especificación 3.0 ...

El tipo de especificaciones de elude el tema en la sección 13.2. Habla sobre los miembros heredados de las interfaces base. Se habla de una clase se extiende otra, pero no las interfaces

EDIT: En la especificación C# 5, sección 13.1.4, utiliza hereda:

Una interfaz puede heredar de cero o más tipos de interfaz

Así que ese es probablemente el mejor término para usar.

+1

Implementa implys definiendo una implementación para una interfaz . Las interfaces no tienen implementación, por lo que no es posible aquí. Pero una interfaz puede ampliar otra interfaz, lo que significa que puede agregar más métodos y heredar su tipo. +1 para Extiende –

+0

VB.Net usa la palabra clave 'Inherits'. Probablemente sería apropiado usar 'Heredadas' al describir el mismo código en C#. –

+3

@BryanRayner: ahora he encontrado el fragmento apropiado de la especificación C# 5 que también usa hereda. –

7

Lo llamo "extiende".

1

tiene la definición incorrecta.

B: A significa "B hereda de A".

cuando decimos "B implementa InterfaceA", que generalmente significa que InterfaceA no tiene la definición para funcionar, solo son prototipos (o, PURE en C++). Sin embargo, en C++ y en la mayoría de las OOPL, la herencia e implementación comparten la misma sintaxis.

Por lo tanto, InterfaceB: InterfaceA todavía significa "InterfaceB hereda InterfaceA".

2

¿Por qué sería incorrecto decir que InterfaceB "hereda" o "deriva de" InterfaceA? "Implementos" sería incorrecto, porque InterfaceB no proporciona una implementación. Semánticamente, derivar interfaces es muy similar a derivar clases. C++, por ejemplo, no distingue entre interfaces y clases.

7

Normalmente, lo llamo sobreingeniería.

+3

INewerVersion extiende IOlderVersion. COldClass implementa IOlderVersion pero no implementa INewerVersion. CNewClass implementa INewerVersion.¿Dónde está la sobreingeniería? –

+2

@Windows programador: esta es una buena excepción. Por lo tanto, el ** generalmente ** sobreingeniería. En primer lugar, esto fue un poco irónico. En segundo lugar, cuando tienes interfaces heredadas de interfaces, tienes al menos tres niveles de herencia porque alguien también implementará esas interfaces. Eso está empezando a llegar allí. – dsimcha

+0

Si intentamos escribir código "SÓLIDO" que rinde homenaje al "Principio de segregación de interfaz", sin tener cada flujo que pueda tanto leer como escribir implementar dos interfaces separadas, ¿debería IStream extender la combinación de IReadableStream e IWriteableStream? ¿O es eso "sobre ingeniería"? Algunas veces me encuentro pensando que un buen proyecto de programación es como un buen aterrizaje de un avión: te alejas de él. – Shavais

6

Como fuente autorizada y en caso de que necesite una cita muy útil, me encontré con info on MSDN que describe "interfaz de herencia" con un ejemplo práctico de la estructura de herencia interfaz para el cuadro combinado, control, cuadro de lista y cuadro de texto:

Y con mención de una interfaz base explícita

una interfaz puede heredar de cero o más interfaces de, que son llamado interfaces base explícitas de la interfaz.

Ejemplo:

interface IControl 
{ 
    void Paint(); 
} 
interface ITextBox: IControl 
{ 
    void SetText(string text); 
} 
interface IListBox: IControl 
{ 
    void SetItems(string[] items); 
} 
interface IComboBox: ITextBox, IListBox {} 

Fuente:

http://msdn.microsoft.com/en-us/library/aa664578%28VS.71%29.aspx

Cuestiones relacionadas