(C #, VS2008) В программе, над которой я работаю, у меня есть много объектов, каждый из которых имеет идентификатор и реализует IComparable, так что списки <> различных объектов легко доступны для поиска по идентификатору. Поскольку я ненавижу копировать / вставлять код, я решил абстрагировать эту функциональность до базового класса, например:
using System;
namespace MyProg.Logic
{
abstract class IDObject : IComparable<IDObject>
{
private int miID;
public int ID
{
get { return miID; }
set { miID = value; }
}
public IDObject(int ID)
{
miID = ID;
}
#region IComparable<IDObject> Members
int IComparable<IDObject>.CompareTo(IDObject other)
{
return miID.CompareTo(other.miID);
}
#endregion
}
}
Недостаток, который я вижу, состоит в том, что два отдельных класса, каждый из которых наследует его, будут напрямую сопоставимы с использованием .CompareTo (), и я надеялся добиться того, чтобы каждый класс, который наследовал от IDObject, был сопоставим только другим классам точно такого же класса , Так что я надеялся выяснить, как это сделать, и придумал это
using System;
namespace MyProg.Logic
{
abstract class IDObject : IComparable<T> where T : IDObject
{
private int miID;
public int ID
{
get { return miID; }
set { miID = value; }
}
public IDObject(int ID)
{
miID = ID;
}
#region IComparable<T> Members
int IComparable<T>.CompareTo(T other)
{
return miID.CompareTo(other.miID);
}
#endregion
}
}
Но это дает ошибку компиляции «Ограничения не допускаются для неуниверсальных объявлений»
Глядя на это, я уверен, что есть способ сделать что-то подобное, чтобы каждый класс был сопоставим только с другими экземплярами этого же класса, но я не могу выявить синтаксис.