Почему я не могу наследовать LinkedListNode <T>? - PullRequest
6 голосов
/ 26 августа 2009

В .NET 3.5 я использую класс LinkedList, но у меня возникла следующая проблема. Я хочу, чтобы элементы этого списка были осведомлены о предыдущих и следующих элементах списка. Другими словами, я хочу, чтобы метод в элементах мог сделать это. Далее, это. Предыдущий. Это возможно? Ниже приведен пример того, что я хотел бы сделать.

Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
days.AddLast(d1);
days.AddLast(d2);

// Here is want I would like to do
d1.Next = ...

Спасибо! * * 1004

Ответы [ 7 ]

12 голосов
/ 26 августа 2009

Во-первых, LinkedListNode равно sealed, поэтому оно не может быть унаследовано.

Во-вторых, LinkedListNode содержит свойства Previous и Next, которые ссылаются на предыдущий и следующий узлы в LinkedList, которые являются данным экземпляром LinkedListNode пришел от.

Наконец, чтобы правильно использовать AddLast, вы должны сделать следующее:

Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
LinkedListNode<Day> node1 = days.AddLast(d1);
LinkedListNode<Day> node2 = days.AddLast(d2);

// now node1.Next refers to node containing d2
// and node2.Previous referes to node containing d1
2 голосов
/ 26 августа 2009

Вы используете это неправильно.

Метод .AddLast(T) возвращает узел связанного списка. Это указывает на ваш день и имеет функции prev и next, которые вы ищете.

1 голос
/ 26 августа 2009

Согласно MSDN , класс LinkedListNode не может быть унаследован.

Майкл указывает, что это сообщение в блоге от Эрика Липперта говорит о том, почему многие классы в структуре запечатаны

0 голосов
/ 19 августа 2010

Единственный способ, которым я могу подумать, чтобы обобщенный T знал о его братьях и сестрах, - это реализовать собственную структуру данных.

public interface ILinkedListNode
{
    ILinkedListNode Next { get; set; }
    ILinkedListNode Previous { get; set; }
}

public class LinkedList<T> where T : ILinkedListNode 
{
    /*.... methods here ...*/
}

public class Node : ILinkedListNode
{
    public Node Next { get; set; }

    public Node Previous { get; set; }

    ILinkedListNode ILinkedListNode.Next
    {
        get { return this.Next; }
        set { this.Next = (Node)value; }
    }

    ILinkedListNode ILinkedListNode.Previous
    {
        get { return this.Previous; }
        set { this.Previous = (Node)value; }
    }
}
0 голосов
/ 26 августа 2009

Почему бы просто не использовать узлы напрямую, чтобы начать с ...

LinkedListNode<Day> d1 = new LinkedListNode<Day>(new Day());
LinkedListNode<Day> d2 = new LinkedListNode<Day>(new Day());
LinkedList<Day> days = new LinkedList<Day>();
days.AddLast(d1); 
days.AddLast(d2);

// Now you can read the node directly
d1.Next...

// If you need to place it somewhere other than at the end (like say you want d2 before d1,
// but d1 is already in the list) use 'AddBefore' and 'AddAfter' eg:
days.AddLast(d2);
days.AddBefore(d2, d1);
0 голосов
/ 26 августа 2009

LinkedListNode - это запечатанный класс, поэтому он не может быть унаследован. Мы настолько избалованы IEnumerable, что упускаем из виду фактические структуры данных, которые мы используем. Это все еще связанный список, поэтому вы можете рассматривать его как один:

LinkedListNode<Day> node = days.First();
while (node != null)
{
    Day day = node.Value;

    // do stuff here...

    node = node.Next();
}
0 голосов
/ 26 августа 2009
Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
// Day's instance doesn't have Next. Its the LinkedListNode that should be used.
LinkedListNode<Day> d1Node = days.AddLast(d1); 
days.AddLast(d2);
...