Я хотел создать наблюдаемый набор, сортируемый , поэтому я начал создавать класс, который наследует наблюдаемые с помощью некоторых методов для его сортировки, тогда я хотел, чтобы этот класс сохранял индекс в дочерних элементах, поэтому я создал интерфейс, который выставляет свойство index, в котором я могу писать, и я оценил T моего класса коллекции как свой интерфейс, тогда я хотел иметь возможность из любого элемента для доступа к parentCollection, и здесь проблемы начались, потому что тип родитель коллекция является общим ... я пробовал много решений, и я думаю, что ковариационная или инвариантность путь, но я не могу заставить его работать ...Ковариация в общих интерфейсах
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary1
{
public class SortableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>, ISortableCollection<T> where T : ISortable<T>
{
public void Sort()
{
//We all know how to sort something
throw new NotImplementedException();
}
protected override void InsertItem(int index, T item)
{
item.Index = index;
item.ParentCollection = this;
base.InsertItem(index, item);
}
}
public interface ISortableCollection<T> : IList<T>
{
void Sort();
}
public interface ISortable<T>
{
Int32 Index { get; set; }
ISortableCollection<T> ParentCollection { get; set; }
}
public class BaseClass : ISortable<BaseClass>
{
public int Index { get; set; }
public ISortableCollection<BaseClass> ParentCollection { get; set; }
}
public class DerivedClass : BaseClass { }
public class Controller
{
SortableCollection<BaseClass> MyBaseSortableList = new SortableCollection<BaseClass>();
SortableCollection<DerivedClass> MyDerivedSortableList = new SortableCollection<DerivedClass>();
public Controller()
{
//do things
}
}
}
это более или менее настройка. Я хотел бы иметь возможность создать SortableCollection<DerivedClass>
, но типы несоответствия ... это правильный способ сделать это?
Точной ошибка
Ошибка 1 Тип «ClassLibrary1.DerivedClass» не может быть использована в качестве параметра типа «Т» в универсальном типе или методе
'ClassLibrary1.SortableCollection<T>'
. Нет никакого неявного преобразования ссылок из класса ClassLibrary1.DerivedClass в'ClassLibrary1.ISortable<ClassLibrary1.DerivedClass>'
. C: \ Users \ luigi.trabacchin \ документы \ Visual Studio 2013 \ Projects \ ClassLibrary1 \ ClassLibrary1 \ Class1.cs 48 89 ClassLibrary1
Я немного поиграл с этим фрагментом кода, и я не смог решить проблему с изменением и базовый класс IList удален, потому что ParentCollection находится как внутри, так и вне. – usr
Эй, спасибо Эрику за действительно хороший ответ. То, что я хотел достичь, было также, чтобы заставить братьев и сестер текущего элемента переключить их порядок, а затем вызвать сортировку ... Я думаю, что я просто проверю тип родительской коллекции и вызову метод, если родительская коллекция реализует интерфейс ... Я сблизился с ограничениями, но это действительно неудобно и все еще что-то не хватает. –