È possibile un'istanza di ciascun oggetto nel costruttore del successivo. Se, per esempio, ogni istanza decoder ha bisogno di un'istanza di acquisizione video a lavorare, allora si può avere un costruttore come segue ...
Decoder(VideoCapture<T> captureDevice)
{
}
E fare la stessa cosa per l'emittente, ovvero avere un costruttore che si terrà a un'istanza del decodificatore come parametro.
In effetti, non sono nemmeno sicuro che avresti bisogno di farmaci generici. Si potrebbe fare, a seconda dell'applicazione. Dopo tutto, possiamo solo vedere una piccola parte in questa domanda. Non sei sicuro di quali tipi passerai in ciascuna di queste classi e in che modo il parametro Type verrà utilizzato al loro interno.
Ma se dovessi azzardare un'ipotesi, penso che la normale gerarchia OO sarebbe la soluzione migliore e più semplice.
Quindi, avere una classe base Capture, che ha il metodo virtuale GetData(). Creerai quindi sottoclassi per i diversi tipi di Cattura che fai. "CapturePal", "CaptureSecam", "CaptureMeSecam", ecc Anche in questo caso, io sono indovinare che sub classificare sarebbe abbastanza per voi, piuttosto che un parametro di tipo generico (sarebbe Capture<float>()
così come Capture<StringBuilder>()
essere significativo nella vostra applicazione?)
Quindi, una volta che hai una classe base e sottoclassi per la tua funzionalità di cattura, fai lo stesso per le tue classi Decoder e Broadcaster. Base class Decoder, sottoclasse "DivxDecoder", "MpegDecoder". Emittente di classe base con sottoclasse "TVBroadcaster", "IPBroadcaster", "TCPBroadcaster" ecc.
Ora, i costruttori per ciascuna classe base prenderanno l'altra classe base come parametro e chiamano i metodi appropriati.
Ciò permetterà di concatenano loro come segue
var myProcessingChain = new TVBroadcaster(new DivxDecoder (new CaptureSecam(inputData))));
assumendo che tutte le classi di cattura assumono lo stesso tipo di ingresso.
L'altra opzione è utilizzare le interfacce. Se la tua applicazione ha alcune classi che possono agire sia come catturatore che come decodificatore, ad esempio.
Pensa un po 'di più se hai davvero bisogno di Generics. I generici sono utili quando si desidera riutilizzare gli algoritmi e si vuole essere agnostici al tipo, mentre si applica la sicurezza del tipo. Essere agnostici di tipo è diverso dall'essere in grado di accettare un insieme di tipi che condividono una comunanza. In questo caso è possibile ottenere la comunanza tra i tipi utilizzando l'ereditarietà.
Cosa speri di scrivere che potrebbe essere più chiaro o più utile della tua prima versione? Quello sembra morto semplice per me. – mquander
se Capture , Decoder e Broadcaster sono tutte interfacce, dovresti probabilmente rinominarle per prefigurarle con un 'I'. Questa è una convenzione di denominazione .NET standard che renderà il tuo codice più facile da comprendere e leggere –
Non sovrappensarlo, solo [mantieni semplice] (http://en.wikipedia.org/wiki/KISS_principle) ... Il tuo il primo snippet di codice va bene –