Metodo generico con argomenti diversi

-1

Nel seguente scenario:
Una factory restituisce un oggetto di una classe logica:

ILogicClass object = factory.GetByRequirements(reqs);

Quindi voglio invocare un metodo e ottenere dei risultati che sono nella stessa forma per tutte le classi logiche concrete:

output = object.GetResults(...)

e quindi usa il risultato.

Immagina che le implementazioni concrete abbiano bisogno di diverse opzioni per produrre il risultato:

GetResult(integer, integer) for one logic class
GetResult(integer, string) for another logic class implementation

Le opzioni per skinare questo particolare gatto che posso inventare sono:

GetResult(integer, integer, integer, string)

Che sta passando TUTTI gli argomenti al metodo in modo che ogni implementazione concreta possa utilizzare i dati richiesti e ignorare il resto

Pro: strongmente tipizzato

Contro: Ogni volta che aggiungi un nuovo parametro, questo deve essere implementato su TUTTE le implementazioni di ILogicClass e la maggior parte non lo userà, il che è uno spreco e non elegante.

Un'altra opzione è:

GetResult(Options opts)

Pro: strong tipizzazione, non è necessario ridefinire l'interfaccia e modificare i tipi di calcestruzzo ogni volta che è necessario qualcosa di nuovo

Contro: L'allocazione di un oggetto extra e la maggior parte del suo contenuto saranno irrilevanti per altre implementazioni.

Una terza opzione sarebbe:

GetResult(dynamic)

Pro: puoi passare quello che vuoi senza creare oggetti aggiuntivi o passare dati irrilevanti

Contro: errore incline alle eccezioni di runtime

Apprezzo che non ci siano altre soluzioni a questo problema, ma esiste un altro modello che non ho considerato o un approccio migliore a questo problema?

    
posta DWorkAccount 24.05.2018 - 12:23
fonte

1 risposta

2

Usa i generici qui per creare una vera sicurezza del tipo, perché in fin dei conti sono i generici:

ILogicClass<T1, T2> object = factory.GetByRequirements<T1, T2>(reqs);

output = object.GetResults(ItemOfT1Type, ItemOfT2Type);

Questo ovviamente presuppone che tu abbia davvero solo due parametri per GetResults e che sia l'unico metodo o anche tutti gli altri metodi siano in grado di lavorare all'interno dei vincoli di T1 e T2 .

    
risposta data 24.05.2018 - 13:03
fonte

Leggi altre domande sui tag