2011-02-01 20 views
10

Sto scrivendo una classe astratta con un metodo astratto (quindi, tutte le classi che ne ereditano devono implementare tale metodo). Tuttavia, non voglio specificare i parametri che il metodo deve utilizzare, poiché ogni metodo può assumere parametri diversi o assenti. Solo il nome e il valore di ritorno dovrebbero essere gli stessi.Definire un metodo astratto senza specificare i parametri

C'è un modo per farlo in C#?

Grazie per qualsiasi aiuto!

risposta

16

No, e sarebbe inutile farlo. Se non hai dichiarato i parametri, non saresti in grado di chiamare il metodo dato solo un riferimento alla classe base. Questo è il punto dei metodi astratti: per consentire ai chiamanti di non preoccuparsi dell'implementazione concreta, ma di fornire loro un'API da utilizzare.

Se il chiamante deve conoscere la firma del metodo esatto, l'utente ha legato quel chiamante a un'implementazione concreta, rendendo l'astrazione sostanzialmente inutile.

Forse se potessi fornire maggiori dettagli, potremmo suggerire un approccio più appropriato? Ad esempio, si potrebbe essere in grado di fare il tipo generico:

public class Foo<T> 
{ 
    public abstract void Bar(T t); 
} 

sottotipi di cemento potrebbe o anche essere generico, o derivare da Foo<string> per esempio.

+0

Ogni bambino deve creare un'implementazione di questo metodo in cui può contenere diversi tipi di input, ma produrrà lo stesso tipo di output. Quindi posso usare l'output per eseguire la logica del mio programma. – TheBoss

+2

@ TheBoss: il punto delle classi astratte (come le interfacce) è quello di consentire ... una buona ..strazione di funzionalità comune. Non puoi usarlo per definire qualcosa come "Hai bisogno di una funzione chiamata' Foo' che richiede * alcuni * (o nessun) parametro e restituisce un 'int'"; tale funzione non può essere astratta, poiché la sua firma non è definita. Sarebbe impossibile chiamare (non in modo riflessivo) dal codice che fa riferimento alla classe a un livello superiore rispetto a dove viene definita la firma specifica, rompendo l'astrazione. –

+0

@ TheBoss: Penso che dovresti esaminare l'uso di Generics per risolvere la tua sfida di progettazione, come nell'esempio di codice pubblicato da Jon. – code4life

0

No, non c'è.

Per sovrascrivere un metodo, è necessario associare la firma del metodo. Questo include il nome del metodo e i parametri di formato.

1

Quello che stai cercando di fare è un odore di codice.

Un modello migliore sarebbe avere la classe astratta implementare ISupportInitialize e quindi disporre di un metodo astratto Act().

L'idea è che tra le chiamate a BeginInit e EndInit è quando i tipi di figlio si preparano ad agire, raccogliendo i diversi bit di informazioni che si stanno cercando di stipare in tipi casuali e numeri di argomenti. Una volta configurato, e viene chiamato EndInit (convalida qui) è possibile chiamare l'abstract Act().

Inoltre, per favore per favore non farlo:

public abstract void Act(params object[] arguments); 

La gente si caccia giù se si fa qualcosa di simile.

+0

Questo è un approccio interessante. Quindi avrei un campo booleano nella classe che indicherebbe quando l'inizializzazione è stata completata, e solo allora il metodo Act() sarebbe stato eseguito correttamente altrimenti avrebbe generato un'eccezione? – TheBoss

+0

@TheBoss la tecnica standard consiste nel verificare lo stato dell'istanza su EndInit e lanciare se non è in uno stato corretto. I tipi che implementano questa interfaccia spesso diventano immutabili dopo una chiamata a EndInit. – Will

Problemi correlati