2012-11-06 21 views
10

Ho pochi concreta che utilizza il seguente tipo di interfacciaclasse fabbrica ritorno un'interfaccia generica

interface IActivity<T> 
{ 
    bool Process(T inputInfo); 
} 

classi di cemento sono come i seguenti

class ReportActivityManager :IActivity<DataTable> 
{ 
    public bool Process(DataTable inputInfo) 
    { 
     // Some coding here 
    } 
} 

class AnalyzerActivityManager :IActivity<string[]> 
{ 
    public bool Process(string[] inputInfo) 
    { 
     // Some coding here 
    } 
} 

Ora come faccio a scrivere la classe di fabbrica che Retuns un'interfaccia generica una cosa come IActivity.

class Factory 
{ 
    public IActivity<T> Get(string module) 
    { 
     // ... How can i code here 
    } 
} 

Grazie

+0

Ottenere errore .. errore CS0050: incoerente accessibilità: tipo di ritorno – Anish

risposta

14

Si dovrebbe creare metodo generico, altrimenti il ​​compilatore non saprà tipo di T nel valore di ritorno. Quando si avrà T si sarà in grado di creare l'attività in base al tipo di T:

class Factory 
{ 
    public IActivity<T> GetActivity<T>() 
    { 
     Type type = typeof(T); 
     if (type == typeof(DataTable)) 
      return (IActivity<T>)new ReportActivityManager(); 
     // etc 
    } 
} 

Usage:

IActivity<DataTable> activity = factory.GetActivity<DataTable>(); 
+0

Ricevo un errore "CS0050 errore: l'accessibilità incoerente: tipo di ritorno" – Anish

+0

anche ottenere Impossibile convertire implicitamente il tipo 'Factory.ReportActivityManager' a 'Factory.IActivity '. Esiste una conversione esplicita (ti manca un cast?) – Anish

+0

@Anna scusa, aggiungi solo il casting. Ho aggiornato la risposta. –

1

Spesso questo è implementato come in lazyberezovsky's answer. In C++ è possibile utilizzare la specializzazione del modello per ottenere errori del compilatore quando si tenta di creare un tipo che la fabbrica non gestisce.

Non puoi farlo in C# ma puoi avvicinarti. Anche se il codice potrebbe sembrare un po 'sorprendente, a sua volta potrebbe essere un problema.

public static class Factory { 
    public static IActivity<someType> Get(this someType self){ 
      //stuff specific to someType 
    } 

    public static IActivity<someOtherType> Get(someOtherType self){ 
      //stuff specific to someOtherType 
    } 

    public static T Creator<T>(){ 
     return null; 
    } 

} 

L'utilizzo sarebbe allora

IActivity<someType> act = Factory.Creator<someType>().Get(); 

ovviamente questo funziona solo se è possibile passare un tipo concreto. Se devi passare un parametro di tipo le cose si complicano.

+0

Non sto bene con C#, ma è solo una svista che il secondo non è un metodo di estensione? –

+0

Inoltre, per quanto riguarda "è possibile utilizzare la specializzazione del modello per ottenere errori del compilatore quando si tenta di creare un tipo che la fabbrica non gestisce", non è possibile utilizzare i vincoli di tipo per ottenere errori del compilatore quando alla fabbrica viene assegnato un tipo che non vuoi occuparti? –

Problemi correlati