2017-05-22 26 views
0

J'ai une structure de classe avec une classe abstraite de base avec des classes dérivées.Comment utiliser un type générique dans ma classe de base?

Ma classe de base ressemble à ceci:

public abstract class Graph 
{ 
    public Dictionary<Vector3, int> Dictionary { private set; get; } 
    public List<T> List { set; get; } 

    public Graph() 
    { 
     Dictionary = new Dictionary<Vector3,int>(); 
    } 
} 

Puis j'ai 2 classes dérivées:

public class Graph_Waypoints : Graph 
{ 
    public Graph_Waypoints() : base() 
    { 
     List = new List<Waypoint>(); 
    } 
} 
public class Graph_Tiles : Graph 
{ 
    public Graph_Tiles() : base() 
    { 
     List = new List<Tile>(); 
    } 
} 

Mais il semble que je ne peux pas les types flexibles pour mon graphique comme celui-ci. L'idée ici est de créer un graphique qui me permette d'utiliser différents objets pour ses nœuds. Que ce soit un graphique de point de cheminement ou un graphique à base de mosaïque.

Mais j'ai du mal à trouver comment obtenir la flexibilité pour cela de me permettre de changer le type quand je crée chaque nouveau graphique.

Est-ce que je vais dans la bonne direction ici? Comment puis-je obtenir la flexibilité de type sur ma liste?

Répondre

4

Vous êtes presque la; vous manque juste quelques éléments clés:

public abstract class Graph<T> // <-- Graph must be generic 
{ 
    public Dictionary<Vector3, int> Dictionary { private set; get; } 
    public List<T> List { set; get; } 

    public Graph() 
    { 
     Dictionary = new Dictionary<Vector3, int>(); 
     // You could initialize the list as you did before, but it's cleaner to do it here 
     List = new List<T>(); 
    } 
} 

public class Graph_Waypoints : Graph<Waypoint> // <-- Subclasses must provide the base class generic arguments 
{ 
    public Graph_Waypoints() : base() 
    { 
    } 
} 
public class Graph_Tiles : Graph<Tile> 
{ 
    public Graph_Tiles() : base() 
    { 
    } 
} 

Notez également, vous n'avez pas besoin d'écrire explicitement : base() lors de l'implémentation des constructeurs-moins arguments; le compilateur le fait pour vous

+1

Ah merci! Maintenant, je comprends comment tout se connecte ensemble! – Sir