2016-12-08 3 views
-1

Я использую метод AddRange из класса ArrayList и я нашел пример:Интерфейс ICollection и 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 имеет параметр типа ICollection, но в примере я могу дать Queue класс (возможно, из-за Queue класс наследуется от интерфейса ICollection). Может somebode объяснить мне, что происходит при вызове AddRange и копировать Queue Тип класса в интерфейсе типа ICollection.

+1

Я не понимаю ваш вопрос. Случается, что элемент из «ICollection» добавляется один за другим в ваш новый список. – HimBromBeere

+1

Боковое примечание: больше не используйте 'ArrayList', используйте общий« Список ». –

+0

Я понимаю функцию. Но что происходит в куче или стеке, если я копирую объект Queue (myQueue) в интерфейсе ICollection? Как я могу использовать класс Queue в AddRange в качестве параметра, если AddRange ожидает интерфейс ICollection? – leoleo

ответ

0

Вы можете использовать тип Queue в качестве параметра для AddRange, также если в качестве параметра требуется ICollection. Это работает, потому что Queue унаследован от ICollection, что означает, что он включает в себя все методы (и свойства), что ICollection имеет и, следовательно, Queue по-прежнему ICollection.

Другой пример:

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); 
    } 
} 

В этой маленькой программе у Вас есть интерфейс IBear и класс Grizzly, который наследуется от IBear. У вас также есть класс BearCave и метод AddBear, который ожидает IBear.

В главном-программе вы можете добавить Grizzly к BearCave, потому что Grizzly еще Bear (IBear).

+0

Спасибо. Мой вопрос: если я передаю объект методу AddRange, что происходит в куче и в стеке? Как .NET преобразует этот объект в тип ICollection? Как объект как тип класса преобразован в тип ICollection? Что копируется? – leoleo

+0

Я не знаю, что вы имеете в виду. Вы хотите знать, как это возможно, что вы можете использовать «Очередь», если ожидается «ICollection» или вы хотите знать, как метод «AddRange» добавляет элементы вашей очереди в список? – daniel59

Смежные вопросы