2016-12-08 2 views
-1

J'utilise la méthode AddRange de la classe ArrayList et je trouve par exemple:Interface ICollection et AddRange C#/NET

ArrayList myAL = new ArrayList(); 
Queue myQueue = new Queue(); 
myQueue.Enqueue("jumped"); 
myQueue.Enqueue("over"); 
myQueue.Enqueue("the"); 
myQueue.Enqueue("lazy"); 
myQueue.Enqueue("dog"); 

// Copies the Queue elements to the end of the ArrayList. 
myAL.AddRange(myQueue); 

AddRange a un paramètre de type ICollection, mais dans l'exemple, je peux donner Queue classe (probablement parce que La classe Queue est héritée de l'interface ICollection). Peut somebode m'expliquer ce qui se passe à l'appel AddRange et copier Queue type de classe dans le type d'interface ICollection.

+1

Je ne comprends pas votre question. Ce qui se passe, c'est que l'élément de ICollection est ajouté un par un à votre nouvelle liste. – HimBromBeere

+1

Side-note: n'utilisez plus 'ArrayList', utilisez un 'Liste ' générique. –

+0

Je comprends la fonction. Mais que se passe-t-il sur le tas ou la pile si je copie l'objet File d'attente (myQueue) dans l'interface ICollection? Comment puis-je utiliser la classe Queue dans AddRange comme paramètre si AddRange attend l'interface ICollection? – leoleo

Répondre

0

Vous pouvez utiliser le type Queue comme paramètre pour AddRange, également si ICollection est requis comme paramètre. Cela fonctionne, parce que Queue est hérité de ICollection, ce qui signifie qu'il comprend toutes les méthodes (et propriétés), que ICollection a et donc Queue est toujours un ICollection.

Un autre exemple:

interface IBear 
{ 
    void Hunt(); 
    void Sleep(); 
    void Eat(); 
} 

class Grizzly : IBear 
{ 
    public int Size { get; set; } 
    public int Weight { get; set; } 

    public void Eat() 
    { 
     // 
    } 

    public void Hunt() 
    { 
     // 
    } 

    public void Sleep() 
    { 
     // 
    } 
} 

class BearCave 
{ 
    private ArrayList bears; 
    public BearCave() 
    { 
     bears = new ArrayList(); 
    } 

    public void AddBear(IBear bear) 
    { 
     bears.Add(bear); 
    } 
} 

MainProgram:

class Program 
{ 
    static void Main(string[] args) 
    { 
     BearCave cave = new BearCave(); 
     Grizzly grizzly = new Grizzly() { Size = 2, Weight = 150 }; 
     cave.AddBear(grizzly); 
    } 
} 

Dans ce petit programme que vous avez l'interface IBear et la classe Grizzly, qui est héritée de IBear. Vous avez également la classe BearCave et la méthode AddBear, qui attend IBear.

Dans la principale programm vous pouvez ajouter un Grizzly au BearCave, parce qu'un Grizzly est encore Bear (IBear).

+0

Merci. Ma question est la suivante: Si je donne un objet à la méthode AddRange, que se passe-t-il sur le tas et sur la pile? Comment transforme-t-il cet objet dans le type ICollection Comment l'objet est-il converti en type ICollection? – leoleo

+0

Je ne vois pas ce que vous voulez dire. Voulez-vous savoir, comment cela est possible, que vous pouvez utiliser 'Queue' si ICollection est attendu ou voulez-vous savoir comment la méthode AddRange ajoute les éléments de votre file d'attente à la liste? – daniel59