2009-04-30 10 views
43

Se ho Classe B: A {}Come si chiama quando un'interfaccia "eredita" da un'altra?

io dico che "Classe B ereditato classe A" o "di classe B deriva da classe A".

Tuttavia, se invece ho:

class B : ISomeInterface {} 

E 'sbagliato dire "B eredita ISomeInterface" - il termine corretto è dire "B implementa ISomeInterface".

Ma, dire che ho

interface ISomeInterface : ISomeOtherInterface {} 

Ora, è ancora sbagliato dire "eredita", ma è ora altrettanto sbagliato dire "attrezzi", in quanto ISomeInterface non implementa nulla.

Quindi, come si chiama quella relazione?

+2

fare la vostra scelta: http://thesaurus.reference.com/search?q=extend Personalmente, come "aggrandizes ISomeInterface ISomeOtherInterface ":-) – nickf

+0

Quindi è valido ora fare ciò che stai chiedendo: interfaccia ISomeInterface: ISomeOtherInterface? Questo è stato "implementato", se si scusa il gioco di parole, nell'ultima specifica del linguaggio C# (se sì, da quale versione in poi?) Mi chiedo se sono ancora bloccato in una distorsione temporale ... – joedotnot

risposta

57

dico personalmente "estende" e ho pensato il C# spec usa questa parola come pure da qualche parte (non riesco a trovare ora, purtroppo) - ma mi ricordo Eric Lippert dicendo che non era molto entusiasta su di esso, e volevo cambiarlo per 4.0.

Penso che sia buono, perché mostra che si sta estendendo il contratto specificato dall'interfaccia originale.

EDIT: Dopo aver guardato le specifiche 3.0 ...

Il tipo di spec passi laterali la questione nella sezione 13.2. Parla dei membri ereditati dalle interfacce di base. Si parla di una classe si estende un altro, ma non interfacce

EDIT: In C# 5 spec, sezione 13.1.4, utilizza eredita:

Un'interfaccia può ereditare da zero o più tipi di interfaccia

Quindi questo è probabilmente il termine migliore da usare.

+1

Gli implementamenti implicano la definizione di un'implementazione per un'interfaccia . Le interfacce non hanno implementazione, quindi non è possibile qui. Ma un'interfaccia può estendere un'altra interfaccia, il che significa che può aggiungere più metodi ed ereditare il suo tipo. +1 per Estensioni –

+0

VB.Net utilizza la parola chiave "Inherits". Probabilmente sarebbe opportuno usare "Inherits" quando si descrive lo stesso codice in C#. –

+3

@BryanRayner: ora ha trovato il bit appropriato della specifica C# 5 che utilizza anche eredita. –

7

Io lo chiamo "estende".

1

hai la definizione sbagliata.

B: A significa "B eredita da A".

quando si dice "B implements InterfaceA", che in genere significa che InterfaceA non ha la definizione per funzionare: sono solo prototipi (o, PURE in C++). Tuttavia, in C++ e nella maggior parte delle OOPL, eredita e implementa la stessa sintassi.

Quindi, InterfaceB: InterfaceA significa ancora "InterfaceB eredita InterfaceA".

2

Perché sarebbe sbagliato dire che InterfaceB "eredita" o "deriva da" InterfaceA? Gli "attrezzi" sarebbero errati, perché InterfaceB non fornisce un'implementazione. Semanticamente, derivare interfacce è molto simile alle classi derivate. C++, ad esempio, non fa alcuna distinzione tra interfacce e classi.

7

Di solito, lo chiamo overengineering.

+3

INewerVersion estende IOlderVersion. COldClass implementa IOlderVersion ma non implementa INewerVersion. CNewClass implementa INewerVersion.Dov'è la sovrastruttura? –

+2

@Windows programmer: questa è una buona eccezione. Da qui, il ** solito ** overengineering. Prima di tutto, questo era un po 'ironico. In secondo luogo, quando hai interfacce che ereditano da interfacce, hai almeno tre livelli di ereditarietà perché qualcuno implementerà anche queste interfacce. Sta iniziando a salire lassù. – dsimcha

+0

Quindi, se stiamo cercando di scrivere il codice "SOLID" che rende omaggio al "Principio di segregazione dell'interfaccia", senza che ogni stream sia in grado di leggere e scrivere implementare due interfacce separate, IStream dovrebbe estendere la combinazione di IReadableStream e IWriteableStream? O è "over engineering"? A volte mi ritrovo a pensare che un buon progetto di programmazione sia come un buon atterraggio di un aereo - te ne allontani. – Shavais

6

come autorevole fonte e nel caso in cui avete bisogno di un preventivo utile, mi sono imbattuto in info on MSDN che descrive "interfaccia eredità" con un esempio pratico della struttura di interfaccia eredità per il ComboBox, controllo, Casella di riepilogo e TextBox:

e con menzione di un interfaccia di base esplicita

un'interfaccia può ereditare da zero o più interfacce, che sono chiamato interfacce di base esplicite dell'interfaccia.

Esempio:

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

Fonte:

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

Problemi correlati