2016-08-27 45 views
0

Je veux créer un PQ qui utilise une classe séparée appelée Key pour stocker les valeurs qui peuvent prendre un type générique, je veux aussi restreindre les types à string et int . Je vais devoir implémenter l'interface IComparable. Comment puis-je faire cela?Classe avec une composition de classe générique qui implémente IComparable, C#

Je reçois un tas d'erreurs concernant les arguments de type, j'ai mis des commentaires dans mon code pour montrer où les erreurs sont.

Comment implémenter quelque chose comme ça?

public class MaxPQ<T> 
{ 
    private Key[] pq; //Key requires 1 type argument 
    private int N; 

    public MaxPQ(int capacity) 
    { 
     pq = new Key[capacity + 1]; //Requires Type arguments 
    } 


    private void exch<T>(int i, int j) 
    { 
     Key<T> temp = pq[i]; //Cannot be used as a type 
     pq[i] = pq[j]; 
     pq[j] = temp; 
    } 



    /// <summary> 
    /// Key class for value in the Priority Queue 
    /// </summary> 
    private class Key<T> where T : IComparable<int, string> //IComparable cannot be used with type argument 
    { 
     T _value; 

     public Key(T value) 
     { 
      _value = value; 
     } 


     public int CompareTo(Key obj) //Required type arguments 
     { 
      if (obj == null) return 1; 

      return; 
     } 


    } 
+0

Qu'essayez-vous exactement d'accomplir? En disant 'where T: IComparable ' vous essayez de restreindre votre 'Key ' à être seulement générique de type 'IComparable '. Votre 'private Key [] pq' essaye de déclarer un type de' class Key' quand il n'existe pas, mais vous pouvez passer dans le paramètre type de 'MaxPQ ' à une clé privée [] 'si vous voudrais? –

+0

J'essaye de restreindre la clé pour être seulement de type string et int, et dans la classe MaxPQ, j'ai un tableau de cette classe clé que je peux comparer les valeurs de chacun de – user2076774

Répondre

0

C'est une façon de le faire:

public class Key<T> 
{ 
    public T Value { get; private set; } 
    private Key() { } 
    public static Key<T> Make(T inVal) 
    { 
     var inT = inVal.GetType(); 
     if (inT != typeof(int) && inT != typeof(string)) 
      throw new TypeAccessException("Wrong type"); 
     return new Key<T> {Value = inVal}; 
    } 
} 

pour l'utiliser:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myKey = Key<string>.Make("StringKeyValue"); 
     Console.WriteLine($"String Key is {myKey.Value}"); 
     var otherKey = Key<int>.Make(23); 
     Console.WriteLine($"integer Key is {otherKey.Value}"); 
     try {var badTypKey = Key<DateTime>.Make(DateTime.Now); } 
     catch (TypeAccessException x) 
     { Console.WriteLine($" Got TypeAccessException {x.Message}"); } 
     Console.WriteLine("Hit any key to terminate."); 
     Console.ReadLine(); 
    } 
} 
0

Est-ce que ce travail?

public class MaxPQ<T> : IComparable<MaxPQ<T>> 
    { 
     static SortedDictionary<T, MaxPQ<T>> dict = new SortedDictionary<T, MaxPQ<T>>(); 
     private string pq; 
     private int N; 

     private void exch(T i, T j) 
     { 
      MaxPQ<T> temp = dict[i]; 
      dict[i] = dict[j]; 
      dict[j] = temp; 
     } 


     public int CompareTo(MaxPQ<T> obj) //Required type arguments 
     { 
      int results = 0; 
      if (this.pq == obj.pq) 
      { 
       results = this.N.CompareTo(obj.N); 
      } 
      else 
      { 
       this.pq.CompareTo(obj.pq); 
      } 
      return results; 
     } 

    }