2012-09-04 9 views
11

Non sono sicuro se questa è una domanda stupida, ma ho appena notato questo:Perché i nomi dei parametri sono necessari in una definizione di interfaccia? Mi è permesso di scegliere nuovi nomi dei parametri durante l'implementazione

public interface IActivityDao : IDao<Activity> 
{ 
    IList<Activity> GetAllSinceSequence(long sequence, int count); 
} 

public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao 
{   
    public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords) 
    { 

    } 
} 

All'interno della mia implementazione che ho chiamato il mio secondo parametro 'MaxRecords.' Tuttavia, nell'interfaccia, è definito come 'conteggio'. Il compilatore considera ancora l'interfaccia implementata, che è buona, ma può portare a un po 'di ambiguità. Chiaramente, dovrei rinominare uno dei parametri in modo che corrisponda all'altro.

Ho giocato un po 'prima di fare il cambio di nome e ho notato qualcosa di interessante. Non mi è permesso di dichiarare la mia interfaccia come:

public interface IActivityDao : IDao<Activity> 
{ 
    IList<Activity> GetAllSinceSequence(long, int); 
} 

E 'solo il compilatore essere eccessivamente protettivo nei confronti C# symantics? Quale scopo servono i nomi dei parametri nel metodo di un'interfaccia oltre a rendere il codice più leggibile? Mi sembra che inviti ad ambiguità se i nomi dei parametri non sono forzati sulle implementazioni.

risposta

19

I nomi dei parametri sono richiesti in una dichiarazione di interfaccia per chiarezza di implementazione e di riferimento. Se qualcuno utilizzava la tua interfaccia, i nomi dei parametri del metodo sono autodocumentanti in modo che il consumatore dell'interfaccia comprenda cosa passare al metodo (ad esempio quando visualizza la descrizione del metodo tramite IntelliSense)

E sì, quando implementa l'interfaccia puoi nominare i parametri come preferisci.

+0

Ti meriti più voti. Hai la risposta migliore di gran lunga. Hai risposto in modo abbastanza sintetico alla domanda dell'OP. – Enigmativity

+2

Beh, una specie di. La risposta, benché chiara, in realtà non affronta l'ultima frase del mio post. Perché non vi è alcuna garanzia che i parametri vengano nominati uguali durante l'implementazione? Se l'unica intenzione è autodocumentare ed essere chiari - perché non portare tale chiarezza fino alle implementazioni? Non voglio pubblicizzare accidentalmente il mio metodo come se accettassi "count" quando mi aspetto veramente "maxResults". –

+3

Perché potresti desiderare una documentazione più specifica a livello di implementazione. Supponiamo che tu abbia creato un'interfaccia IBinaryMathOperation, con un metodo Execute (int operand1, int operand2). Quindi hai implementato una classe AddOperation implementando l'interfaccia. Gli "operandi" a un metodo add sono più specificamente noti come "addendi" e potresti chiamarli nella specifica implementazione di Execute(). – KeithS

2

Immagino che questo sia dovuto alla funzione parametri denominata in C#. Vale a dire, è necessario essere in grado di specificare i parametri per nome, non solo nell'ordine predefinito:

IActivityDao dao; 
dao.GetAllSinceSequence(count: 1, sequence: 2); 

Naturalmente, i nomi dei parametri sarebbe diversa se l'oggetto è lanciato come l'istanza.

var concreteDao = (ActivityDao) dao; 
concreteDao.GetAllSinceSequence(maxRecords: 1, sequence: 2); 
+2

Tranne che dette interfacce post-date di funzionalità per gran parte di un decennio. –

+0

@KirkWoll ha ... buon punto. – McGarnagle

2

Lasciate che vi chieda questo, c'è un altro posto nel framework .net che consente di definire una firma del metodo senza nomi parametro?

Alla fine della giornata tutto è possibile ma la maggior parte delle cose ci sono per un motivo, in questo caso immagino che questo sia un limite del framework e del design del compilatore, e conta davvero?

Dopo tutto, si sta definendo un contratto per l'uso, ci si aspetterebbe che fossero lì davvero.

+0

+1 Per menzionare i contratti –

1

Molte lingue come C# e supporto VB named and option arguments to methods. Senza i nomi degli argomenti nell'interfaccia, non sarebbe possibile utilizzare argomenti denominati e opzionali. Assegnare un nome agli argomenti aiuta anche il lettore a comprendere l'intenzione e la funzione dell'interfaccia.

8

Cronologia. Questo risale ai primissimi giorni di .NET, quando la COM ha governato il mondo. Essere in grado di interoperare con COM era molto importante allora, nessuno mai butta via tutto per adottare uno stile di programmazione completamente nuovo.

Che ha reso l'interoperabilità di COM fortemente supportato in .NET in generale. Oltre alla necessità di avere argomenti con nome per i metodi di interfaccia, le librerie dei tipi li richiedono.

L'interessante caso d'angolo è per sempre il linguaggio C++/CLI.Ha adottato molte regole di sintassi C++, inclusa la possibilità di omettere i nomi dei parametri nelle dichiarazioni. In altre parole, questo è legale:

public interface class IFoo 
    { 
     void bar(int, long, double); 
    }; 

il tipo di libreria esportatore genera questa dichiarazione:

HRESULT bar(
        [in] long p1, 
        [in] long p2, 
        [in] double p3); 

Molto simile risultato se si implementa l'interfaccia in una classe C#, come generata automaticamente da IntelliSense:

class FooImpl : cpptemp36.IFoo { 
    public void foo(int __p1, int __p2, double __p3) { 
     throw new NotImplementedException(); 
    } 
} 

Questo non rende felice nessuno.

Problemi correlati