2011-12-23 7 views
19

In C# dobbiamo nominare i parametri di un metodo di un'interfaccia.Perché dobbiamo assegnare un nome ai parametri del metodo di interfaccia?

ho capito che, anche se non abbiamo dovuto, così facendo aiutare il lettore a capire il significato, ma in alcuni casi non è realmente necessario:

interface IRenderable 
{ 
    void Render(GameTime); 
} 

direi quanto sopra è leggibile e significativa come il qui sotto:

interface IRenderable 
{ 
    void Render(GameTime gameTime); 
} 

c'è qualche tecnico motivo per cui sono necessari i nomi per i parametri di metodi su un'interfaccia?


vale la pena notare che l'attuazione del metodo di interfaccia può utilizzare nomi diversi da quelli di metodo dell'interfaccia.

+0

penso che avrebbe fatto i nomi di metodo di firma coerente !!! –

+0

Vedere il mio ultimo commento modificato. –

+1

quello a cui mi riferisco è come le dichiarazioni dei metodi sono coerenti tra classi e interfacce ... –

risposta

19

Un possibile motivo potrebbe essere l'uso di parametri facoltativi.

Se si stesse utilizzando un'interfaccia, sarebbe impossibile specificare i valori dei parametri denominati. Un esempio:

interface ITest 
{ 
    void Output(string message, int times = 1, int lineBreaks = 1); 
} 

class Test : ITest 
{ 

    public void Output(string message, int numTimes, int numLineBreaks) 
    { 
     for (int i = 0; i < numTimes; ++i) 
     { 
      Console.Write(message); 
      for (int lb = 0; lb < numLineBreaks; ++lb) 
       Console.WriteLine(); 
     } 

    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ITest testInterface = new Test(); 
     testInterface.Output("ABC", lineBreaks : 3); 
    } 
} 

In questa implementazione, quando si utilizza l'interfaccia, ci sono parametri di default su times e lineBreaks, quindi, se l'accesso tramite l'interfaccia, è possibile utilizzare le impostazioni predefinite, senza i parametri denominati, saremmo impossibile saltare il parametro times e specificare solo il parametro lineBreaks.

Solo una FYI, a seconda se si sta accedendo al metodo Output tramite l'interfaccia o tramite la classe determina se i parametri predefiniti sono disponibili e qual è il loro valore.

+0

Le interfacce erano presenti prima dei parametri facoltativi e denominati. :) – CodeCaster

+0

@CodeCaster Buon urlo, molto probabilmente non la ragione originale, ma è sicuramente una ragione ora :) Immagino che la possibilità di funzionalità future come questa fosse la ragione per cui li hanno nominati. – Lukazoid

+0

@Lukazoid, ben fatto. Questa è la risposta più logica in qualsiasi modo tu la guardi. –

9

Non vedo alcuna ragione che renderebbe questo un requisito tecnico. Ma posso pensare ad un motivo particolarmente valido:

Come si menziona, i nomi dei parametri non sono necessari quando si implementa l'interfaccia e possono essere facilmente sostituiti.
Tuttavia, quando utilizzando l'interfaccia, immagina la difficoltà se nessun parametro ha nomi significativi! Nessun intellisense, nessun indizio, nient'altro che un tipo? Che schifo.
Questo deve essere il motivo principale per cui è sempre richiesto un nome.

+0

in più lo rende coerente con le dichiarazioni di metodo nelle classi. – Thilo

+2

"immagina la difficoltà se nessun parametro ha nomi significativi!" - scrivi semplicemente Java in Eclipse, la maggior parte dei nomi dei parametri è mostrata come "arg0" ecc ... – Adam

+1

@codesparkle Sembra divertente quanto leggere un file JavaScript minisito! –

0

Ok, questa possibilità sembra quasi troppo frivola, ma - forse così quando si consente a Visual Studio di implementare l'interfaccia e lo stub in proprietà e metodi, sa come denominare i parametri?

D'altra parte, non ha alcun problema VS genericamente denominazione controlli ...

1

non riesco a pensare di qualsiasi ragione tecnica valida che le interfacce avere nomi definiti.

Posso facilmente vedere una situazione in cui i nomi sono auto-implementati come i membri di supporto per le proprietà auto-implementate sono oggi.

Tuttavia, penso che probabilmente ci sono 3 motivi principali per cui sono stati necessari:

1) E 'stato probabilmente sostanzialmente più facile da implementare la convalida interfaccia nella compilatore utilizzando le stesse regole dei metodi attuali. Poiché solo relativamente di recente sono state introdotte le proprietà auto-implementate, sospetto che questa sia una modifica non banale del compilatore.

2) Per quelle lingue che supportano la creazione automatica dei membri dell'interfaccia nella classe di implementazione (ad esempio VB), è probabilmente molto più facile creare l'implementazione dell'interfaccia utilizzando nomi predefiniti rispetto al tentativo di creare nomi al volo .

3) Poiché un'interfaccia può essere esposta al di fuori dell'applicazione di definizione, i nomi rimuovono l'ambiguità associata a un'interfaccia mal definita.

Per esempio, il tentativo di implementare un metodo di interfaccia di:

void Foo(string, string, int) 

molto probabilmente portare a sostanzialmente più confusione che il tuo esempio di auto-documentazione. Tuttavia, si tratta di un problema di usabilità dell'interfaccia più che tecnico, sebbene si possa sostenere che, se l'interfaccia è inutilizzabile, esiste un problema tecnico sottostante.

2

Naming metodo di interfaccia parametri aiuta con la documentazione di sé:

Per esempio ...

interface IRenderable 
{ 
    void Render(TimeSpan gameTime); 
} 

... dice più:

interface IRenderable 
{ 
    void Render(TimeSpan); 
}