(C#, VS2008) En un programa en el que estoy trabajando, tengo muchos objetos que tienen una ID e implementan IComparable, por lo que la lista <> -s de los diversos objetos se puede buscar fácilmente por ID. Desde odio código de copiar/pegar, pensé que sería abstracto que poco de funcionalidad a una clase base, así:¿Cómo hacer una clase base abstracta IComparable que no compare dos clases heredadas por separado?
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
}
}
El inconveniente que veo a esto es que dos clases separadas que heredan cada uno lo haría ser directamente comparable usando .CompareTo() y esperaba hacer cumplir que cada clase que hereda de IDObject es solo comparable a otras de la misma clase. Así que estaba esperando a encontrar la manera de hacer eso y se acercó con esta
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
}
}
Pero eso da un error de compilación de "Las restricciones no son permitidos en las declaraciones no genéricos"
mirarlo, I Estoy seguro de que hay una manera de hacer algo así para que cada clase solo sea comparable a otras instancias de la misma clase, pero no puedo desentrañar la sintaxis.
+1. Buen punto. He actualizado mi respuesta para mostrar el patrón sin tener que resolver el problema de ID. –
Los identificadores provienen de una columna SQLite DB Integer Primary Key - Por lo tanto, garantizados por SQLite para ser únicos entre un tipo de objeto, pero dos objetos de diferentes tipos podrían superponerse, por lo tanto, limitar el IComparable a solo miembros de la misma clase. – Drogo