Limitare T a stringa e int?

voti
13

Ho costruito io stesso una classe insieme generico che è definita come questo.

public class StatisticItemHits<T>{...}

Questa classe può essere utilizzato con inte stringsolo i valori. Tuttavia questo

public class StatisticItemHits<T> where T : string, int {...}

non verrà compilato. Che cosa sto facendo di sbagliato?

È pubblicato 18/01/2009 alle 13:25
fonte dall'utente
In altre lingue...                            


7 risposte

voti
1

Non è possibile farlo con 'dove'. Non si può fare una 'o'.

Risposto il 18/01/2009 a 13:30
fonte dall'utente

voti
13

La restrizione tipo è pensato per essere utilizzato con le interfacce. Il campione suggerisce che si desidera consentire classi che ereditano da int e la stringa , che è un pò una sciocchezza. Vi suggerisco di progettare un'interfaccia che contiene i metodi che userete nelle vostre StatisticItemHits classe generica, e di utilizzare tale interfaccia come restrizione. Comunque io non vedo le vostre esigenze qui, forse si potrebbe inserire qualche dettaglio in più circa lo scenario?

Risposto il 18/01/2009 a 13:30
fonte dall'utente

voti
1

Non si può limitare ad archi e int dalla clausola dove. È possibile verificare nel costruttore, ma che probabilmente non è un buon posto per essere il controllo. Il mio approccio sarebbe quello di specializzarsi la classe e la creazione astratta classe in un (semi) modello di fabbrica:

class MyRestrictedGeneric<T>
{
    protected MyRestrictedGeneric() { }


    // Create the right class depending on type T
    public static MyRestrictedGeneric<T> Create<T>()
    {
        if (typeof(T) == typeof(string))
            return new StringImpl() as MyRestrictedGeneric<T>;

        if (typeof(T) == typeof(int))
            return new IntImpl() as MyRestrictedGeneric<T>;

        throw new InvalidOperationException("Type not supported");
    }


    // The specialized implementation are protected away
    protected class StringImpl : MyRestrictedGeneric<string> { }
    protected class IntImpl : MyRestrictedGeneric<int> { }
}

In questo modo è possibile limitare l'utilizzo della classe a poco corda e int internamente dentro la classe.

Risposto il 18/01/2009 a 13:32
fonte dall'utente

voti
6

Si potrebbe fare StatisticItemHits<T>una classe astratta e creare due sottoclassi:

StatisticItemHitsInt : StatisticItemHits<int>{}

StatisticItemHitsString : StatisticItemHits<string>{}

In questo modo non ci può essere solo un int e string-rappresentazione di StatisticItemHits

Risposto il 18/01/2009 a 13:39
fonte dall'utente

voti
3

Come altri hanno detto, non è possibile utilizzare le restrizioni di tipo in questo modo. Che cosa si può fare è quello di specializzarsi dal tipo di base come segue:

public class StatisticItemHits <T> { }

public class StringStatisticItemHits : StatisticItemHits<string> { }

public class IntegerStatisticItemHits : StatisticItemHits<int> { }

Inoltre, come la vostra classe di base è generico, non sarà in grado di utilizzare questo per polimorfico. Se avete bisogno di fare questo make StatisticItemHits implementare un'interfaccia e utilizzare questo per fare riferimento a istanze. Qualcosa di simile a:

public class StatisticItemHits <T> : IStaticticItemHits { }

public interface IStatisticItemHits { }
Risposto il 18/01/2009 a 13:41
fonte dall'utente

voti
2

Dato che hai solo due tipi qui vorrei andare giù un percorso OO qui invece e solo due classi per i due tipi.

I generici sono utilizzati meglio, dove le circostanze in cui possono essere applicate sono, si sa, generici . Sono molto meno uso in circostanze come questa.

È possibile limitare a struct o tipi di classe unica, e io credo che ci devono essere restrizioni numeriche o operatore a base (ad esempio, deve supportare + =)

Int e la stringa sono davvero molto diverso, sicuramente più diverso da int e doppio. Non avrebbe molto senso per una classe generica per supportare il tipo di riferimento immutabile di stringa e il tipo di valore di int senza supportare anche altri tipi simili di una di esse.

Risposto il 18/01/2009 a 17:00
fonte dall'utente

voti
-3

È sufficiente utilizzare:

where TSource : IEquatable<string>
Risposto il 14/01/2014 a 19:13
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more